Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 3
Регистрация: 31.01.2016
Сообщений: 77
.NET 4.x

Поиск минимального количества совпадений

19.07.2016, 16:47. Показов 1468. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть код по поиску просто количества одинаковых чисел в активных текстбоксах по нажатию кнопки и вывод этого количества в label2:
C#
1
2
3
4
5
6
7
        private void button1_Click(object sender, EventArgs e)
        {
            foreach (TextBox tb in Controls.OfType<TextBox>().Where(x => x.Enabled == true))
            {
                label2.Text = Controls.OfType<TextBox>().SelectMany(x => x.Text.Split(" ;:,.-".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)).GroupBy(x => x).Count(x => x.Count() > 1).ToString();
            }
        }
Подскажите, как мне переделать этот код, чтобы он сравнивал не все активные текстбоксы сразу, а каждый с другим, например, первый со вторым, первый с третьим и т. д., затем возвращался ко второму и сравнивал его со следующими, ну и так далее. Это первое. Второе - нужно, чтобы код после сравнения текстбоксов друг с другом вывел в текст лэйбла (можно хоть куда) минимальное количество одинаковых чисел, можно даже 0, то есть даже если совпадений вообще нет. И хотелось бы, чтобы после всего этого всё-таки как-то выявить в каких текстбоксах было найдено минимум повторяющихся чисел, например, поменять их фоновые цвета (BackColor) на другие.

Небольшое пояснение ко всему этому.
В коде tb - это массив нескольких текстбоксов.
В каждом тектбоксе все числа разные и не повторяются, они вводятся пользователем, а не рандомно, и через пробел.
И для понятности приведу простой пример с тремя текстбоксами. В первом есть числа 10 15 20, во-втором 10 11 25, в третьем 30 11 25. Здесь видно, что у первого со вторым одно совпадение, у второго с третьим два, у первого с третьим ни одного. В итоге мин. кол-во одинаковых чисел - 0, и это число вставляется в текст лэйбла, а текстбоксы первый и третий меняют свой цвет фона.
Наговорил много, но думаю для многих это будет простая задачка. )))
Да, и ещё, если будет не трудно, как мне сделать, чтобы по нажатию уже другой кнопки сравнивать текстбоксы не каждый с каждым, а только первый со всеми остальными? Например, если текстбокса 3, то сравнить первый со вторым и с третьим, а уже второй с третьим не надо. Ну и опять же после всего этого вывести минимум и поменять цвет фонов.
Заранее большое спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.07.2016, 16:47
Ответы с готовыми решениями:

Подсчет количества совпадений в DataGridView
Приветствую всех! Есть dgv, в него выводится результат запроса. Как организовать поиск по dgv так, чтобы если значение в ячейке равно 1,...

Поиск совпадений
Привет, подскажите как осуществить: Пользователь вводит с клавиатуры слово, в текстовом файле ищется данное слово, и если в текстовом...

Поиск совпадений
Помогите пожалуйста, задали начинающему такую задачку хоть вешайся... На входе: каталог. На выходе: список файлов, имеющих совпадающие...

7
77 / 77 / 42
Регистрация: 30.09.2014
Сообщений: 342
20.07.2016, 11:02
Лучший ответ Сообщение было отмечено Sniper как решение

Решение

Я бы предложил создать массив текст боксов например так

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 foreach (TextBox tb in Controls.OfType<TextBox>().Where(x => x.Enabled == true))
            {
                countTextBox++; // считаем сколько их будет 
            }
 
 
 
 
 
            TextBox[] myTextBoxes = new TextBox[countTextBox]; // создаем массив
            countTextBox = 0;
 
            foreach (TextBox tb in Controls.OfType<TextBox>().Where(x => x.Enabled == true))
            {
                myTextBoxes[countTextBox] = tb;   // заполняем массив 
                countTextBox++;
 
            }

а потом идти по этому массиву и смотре что там и как

Добавлено через 30 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
            string[] ar1 , ar2 ;
            string res="";
            string resAll = "";
            int count = 0;
 
 
 
 
            for (int i = 0; i < myTextBoxes.Length; i++)
            {
 
                for (int j = i+1; j < myTextBoxes.Length; j++)
                {
                  //  if (i == j)
                    //    continue;
 
 
 
                    res += string.Format("{0}  и {1} одинаковые:", myTextBoxes[i].Name, myTextBoxes[j].Name);
 
 
                    ar1 = myTextBoxes[i].Text.Split(" ;:,.-".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                    ar2 = myTextBoxes[j].Text.Split(" ;:,.-".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
 
                    for (int k1 = 0; k1 < ar1.Length; k1++)
                        for (int k2 = 0; k2 < ar2.Length; k2++)
                            if (ar1[k1] == ar2[k2])
                            {
                                res += ar2[k2] + "; ";
                                count++;
                            }
 
                    res = res + "элементов = " + count + "\n";
                    count = 0;
                }
 
                resAll += res;
                res = "";
              
            }
 
                MessageBox.Show(resAll);
Добавлено через 20 минут
если хочешь чтоб цветом красилось то добавляем следующие ...


C#
1
2
3
4
foreach (TextBox tb in Controls.OfType<TextBox>().Where(x => x.Enabled == true))
            {
                countTextBox++; // считаем сколько их будет 
            }
сюда добавляем строчку

C#
1
 tb.BackColor = Color.White;
чтобы все изначально белым сделать.


после строчки int count=0; добавляем

C#
1
2
3
  int mincount = 88888888;
            TextBox tb1 = new TextBox();
            TextBox tb2 = new TextBox();

и перед строчкой count=0 ; добавляем
C#
1
2
3
4
5
6
7
                    if (mincount > count)
                    {
                        mincount = count;
                        tb1 = myTextBoxes[i];
                        tb2 = myTextBoxes[j];
 
                    }


ну и в самом конце красим в нужный цвет

C#
1
2
            tb1.BackColor = Color.Azure;
            tb2.BackColor = Color.Azure;
1
0 / 0 / 3
Регистрация: 31.01.2016
Сообщений: 77
20.07.2016, 15:51  [ТС]
Спасибо большое, проверю.

Добавлено через 37 минут
Проверить пока не получится, так как есть небольшая ошибка, точнее неизвестно откуда берётся countTextBox, Visual Studio пишет, что его не существует. Где его нужно создать? И ещё вопрос, весь этот код вставлять в обработчик события нажатия кнопки?

Добавлено через 3 минуты
Кстати, а для чего закомментирован этот код:
C#
1
2
//  if (i == j)
//    continue;
0
0 / 0 / 3
Регистрация: 31.01.2016
Сообщений: 77
23.07.2016, 12:58  [ТС]
С countTextBox я разобрался. Сделал так
C#
1
int countTextBox = tb.OfType<TextBox>().Count(x => x.Enabled);
Проверил, вроде всё работает - ищет минимальное кол-во совпадений и меняет цвет фонов.
Спасибо, что помогли разобраться с кодом.
Но мне нужно ещё чтобы код сравнивал только первый текстбокс со всеми остальными, как я и написал в конце своей темы. Если не трудно, подскажите какую часть кода добавить во вторую кнопку.
Да, и кстати, я писал только про вывод минимального кол-ва и замену фона. Вывод окна сообщения СО ВСЕМИ текстбоксами, их именем, совпавшими числами - это уже немного лишнее. Поэтому, какую-то часть кода лучше бы удалить. Строку
C#
1
MessageBox.Show(resAll);
я удалил, вместо неё добавил
C#
1
label4.Text = mincount.ToString();
но что лишнее удалить в остальном коде я не разобрался пока.
Надеюсь поможете разобраться с кодом для второй кнопки и с лишним кодом.
Но спасибо и за тот код.
0
 Аватар для EveKS
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
24.07.2016, 18:37
Решил я эту задачку так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void button1_Click(object sender, EventArgs e)
        {
            Controls.OfType<TextBox>().Where(t => t.Enabled == true).ToList().ForEach(tb =>
            {
                var _tb = tb.Text.Split(" ;:,.-".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList();
                Controls.OfType<TextBox>().Where(t => t != tb).ToList().ForEach(t =>
                    {
                        var _t = t.Text.Split(" ;:,.-".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList();
                        _t.ForEach(s =>
                        {
                            if (_tb.Contains(s))
                            {
                                t.BackColor = Color.Red;
                                tb.BackColor = Color.Red;
                            }
                        });
                    });
            });
            label1.Text = Controls.OfType<TextBox>().SelectMany(t => t.Text.Split(" ;:,.-".ToCharArray(),
                StringSplitOptions.RemoveEmptyEntries)).GroupBy(t => t).Where(t=>t.Count()>1).Min(t => t.Count()).ToString();
        }
Если не сложно, подскажите как можно было избавиться от ToList(), ну и еще пару советов. Еще мне не нравится, что в таком варианте нельзя использовать break.

PS. Т.к. я не совсем понял как автор получает 0, я решил сделать так, чтобы в лейбл выводилось минимальное кольчиство текстбоксов в которых есть совпадения хотя бы одного из чисел.
Кликните здесь для просмотра всего текста

Пример ввода в текстбоксы:
Code
1
2
3
4
5
6
7
8
9
10
11
12121 12 12 1 21 21 21 2 1
42 24 2 423 2 43 24
2. 2.4.32. 423. 4.2 .4 2.4. 32. 4.2
2,4, 2,4,234,23, 423, 4,23 ,423, 4,2 ,2 ,4
2;4;234;23;4 3;24;23; 432; 4;23 4;23 ;4
2 ;423; 4;2 ;42;3 4;23 ;4
;24; 23; 4;23 4;23; 4;23
2 432 42 24 2 423
45 45 645 6
75 567 56
56 65 865 7
Мой код выведет 2, т.е. минимальный повтор одного из чисел в другом, содержится всего в 2х текстбоксах.
И подсветит все тб, кроме 45 45 645 6
0
0 / 0 / 3
Регистрация: 31.01.2016
Сообщений: 77
29.07.2016, 19:55  [ТС]
Нет, это не совсем то. Мне нужно сравнивать по два разных текстбокса, выявить количество повторяющихся в них чисел, потом из всех этих количеств выбрать меньшее и закрасить те текстбоксы где и был найден этот минимум. К примеру, в первом и во втором текстбоксах 8 одинаковых чисел, в первом и третьем 3, в первом и четвертом 5, во втором и третьем 1. В итоге - второй и третий текстбоксы меняют цвет фона, а в текст какого-нибудь лэйбла идёт значение 1. Код пользователя OTT работает, после того, как я его доработал. Но есть две проблемки, вот эти строчки присваивания текста к string res и ResAll явно лишние, мне нужно было просто выводить значение мин. кол-ва совпадений, допустим, в текст label. Вторая проблемка - перепробовал много способов, но не могу разобраться, как мне из всех найденных количеств просмотреть не минимальное, а допустим закрасить текстбоксы в которых по три совпадения или по четыре, без разницы.
Не особо просматривал Ваш код, но думаю он был бы правильнее, так как мне больше подходит LINQ и с ним наверно проще было бы решить эту задачку. )

Добавлено через 27 минут
Кстати, в каждом текстбоксе нет одинаковых чисел и сравниваться числа должны не в каждом боксе, а между двумя разными текстбоксами. Приведу небольшой пример. В первом текстбоксе введено 5 чисел - 1 2 3 4 5, во втором 1 2 3 4 6, в третьем 1 6 7 8 9. Здесь видно, что между первым и вторым - 4 совпадения, между первым и третьим - 1, между вторым и третьим - 2. В итоге минимальное совпадение чисел есть между первым и третьим текстбоксами, они должны поменять цвет фона и в текст какого-нибудь лэйбла должно передаться значение 1(естественно ToString()).
Есть у меня похожий код, но он сравнивает все разом текстбоксы, которые есть в массиве.
C#
1
2
3
4
5
6
7
private void button1_Click(object sender, EventArgs e)
        {
            foreach (TextBox tb in Controls.OfType<TextBox>().Where(x => x.Enabled == true)) // tb - массив текстбоксов
            {
                label2.Text = Controls.OfType<TextBox>().SelectMany(x => x.Text.Split(" ;:,.-".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)).GroupBy(x => x).Count(x => x.Count() > 1).ToString();
            }
        }
Но мне нужно сравнивать их по отдельности между собой, проще говоря 1-ый со 2-ым, 1-ый с 3-им, 1-ый с 4-ым и т.д.
0
 Аватар для EveKS
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
29.07.2016, 20:51
Цитата Сообщение от Sniper Посмотреть сообщение
Кстати, в каждом текстбоксе нет одинаковых чисел и сравниваться числа должны не в каждом боксе, а между двумя разными текстбоксами. Приведу небольшой пример. В первом текстбоксе введено 5 чисел - 1 2 3 4 5, во втором 1 2 3 4 6, в третьем 1 6 7 8 9. Здесь видно, что между первым и вторым - 4 совпадения, между первым и третьим - 1, между вторым и третьим - 2. В итоге минимальное совпадение чисел есть между первым и третьим текстбоксами, *** и в текст какого-нибудь лэйбла должно передаться значение 1(естественно ToString()).
C#
1
2
label1.Text = (Controls.OfType<TextBox>().SelectMany(t => t.Text.Split(" ;:,.-".ToCharArray(),
                StringSplitOptions.RemoveEmptyEntries)).GroupBy(t => t).Where(t=>t.Count()>1).Min(t => t.Count()) - 1).ToString();
Добавлено через 27 минут
Sniper, в общем я дал далеко неверный ответ... простых решений придумать не могу, через Linq, в итоге минимум 3 цикла с несколькими списками...
0
0 / 0 / 3
Регистрация: 31.01.2016
Сообщений: 77
30.07.2016, 13:31  [ТС]
Ваш код я немного переделал под себя, он работает. Но есть небольшая проблемка, я перепробовал много способов, и не могу сообразить как мне, допустим, определять не минимальное количество совпадений, а например 3 совпадения или 4, и закрашивать текстбоксы именно с этим заранее выбранным количеством совпадений.
Я сделал вот так, но код работает некорректно, и не всегда находит то, что нужно. Я попробовал искать какое-то число совпадений, если выбран определённый чекбокс.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
private void bOnlyOne_Click(object sender, EventArgs e)
        {
            int KolSovp1 = 0;
            if (Chislo1.Checked)
            {
                KolSovp1 = 1;
            }
            if (Chislo2.Checked)
            {
                KolSovp1 = 2;
            }
            if (Chislo3.Checked)
            {
                KolSovp1 = 3;
            }
            if (Chislo4.Checked)
            {
                KolSovp1 = 4;
            }
            if (Chislo5.Checked)
            {
                KolSovp1 = 5;
            }
            if (Chislo6.Checked)
            {
                KolSovp1 = 6;
            }
            foreach (TextBox tbColor in tb.OfType<TextBox>().Where(x => x.Enabled))
            {
                tbColor.BackColor = Color.White;
            }
            int countTextBox = tb.OfType<TextBox>().Count(x => x.Enabled);
            TextBox[] myTextBoxes = new TextBox[countTextBox]; // создаем массив
            countTextBox = 0;
 
            foreach (TextBox tbj in tb.Where(x => x.Enabled == true))
            {
                myTextBoxes[countTextBox] = tbj;   // заполняем массив 
                countTextBox++;
            }
            string[] ar1, ar2;
            string res = "";
            string resAll = "";
            int count = 0;
            int mincount = 88888888;
            TextBox tb1 = new TextBox();
            TextBox tb2 = new TextBox();
 
            for (int i = 0; i < myTextBoxes.Length; i++)
            {
                for (int j = i + 1; j < myTextBoxes.Length; j++)
                {
                    res += string.Format("{0}  и {1} одинаковые:", myTextBoxes[i].Name, myTextBoxes[j].Name);
                    ar1 = myTextBoxes[0].Text.Split(" ;:,.-".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                    ar2 = myTextBoxes[j].Text.Split(" ;:,.-".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                    for (int k1 = 0; k1 < ar1.Length; k1++)
                        for (int k2 = 0; k2 < ar2.Length; k2++)
                            if (ar1[k1] == ar2[k2])
                            {
                                res += ar2[k2] + "; ";
                                count++;
                            }
                    res = res + "элементов = " + count + "\n";
                    if (count == KolSovp1)
                    {
                            mincount = count;
                            tb1 = myTextBoxes[i];
                            tb2 = myTextBoxes[j];
                    }
                    count = 0;
                }
                resAll += res;
                res = "";
            }
            lSovpadeniy.Text = mincount.ToString();
            foreach (TextBox tbj in tb.Where(x => x.Enabled == true))
            {
                countTextBox++; // считаем сколько их будет 
                tbj.BackColor = Color.White;
            }
            tb1.BackColor = Color.Yellow;
            tb2.BackColor = Color.Yellow;
        }
Переменную KolSovp1 я добавляю в код
C#
1
2
3
4
5
6
if (mycount < count)
                    {
                            mincount = count;
                            tb1 = myTextBoxes[i];
                            tb2 = myTextBoxes[j];
                    }
и получается так
C#
1
2
3
4
5
6
if (count == KolSovp1)
                    {
                            mincount = count;
                            tb1 = myTextBoxes[i];
                            tb2 = myTextBoxes[j];
                    }
Да, и кстати, чтобы сравнивать первый текстбокс со всеми остальными - [i] я заменил на [0] в коде
C#
1
ar1 = myTextBoxes[0].Text.Split(" ;:,.-".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
Это работает, но после добавления кода поиска только определённого количества совпадений, этот код тоже перестал работать правильно.
Надеюсь поможете разобраться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.07.2016, 13:31
Помогаю со студенческими работами здесь

Поиск совпадений по массиву
В строковом массиве находятся строки слова. string={&quot;hi&quot;, &quot;here&quot;, &quot;your&quot;, &quot;program&quot;, &quot;program&quot;}; Нужно осуществить поиск по заданному...

Поиск совпадений в массивах
Добрый вечер. Подскажите пожалуйста как найти совпадения в n массивах различной длинны. Допустим есть 3 массива (хотя может быть от 1...

Поиск совпадений в тексте
Очередной раз привет всем! Уже в третий раз задаю подобный вопрос. Пожалуйста подскажите! есть текст string text = &quot;привет...

Поиск совпадений в массиве
Добрый день. нужно реализовать алгоритм на c#. Вводим массив чисел, например: 1,5,4,6,2,12,16,3,8,...,6... На каждом шаге, программа...

Поиск совпадений 85% и более
День добрый! Хочу попросить совета и помощи. Может кто то сталкивался с такой задачей или имеет представление как решить ее. Есть список...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru