Cee08 Ответов: 1

Как получить пересечение двух массивов из двух текстовых полей в приложении C# windows?


Я пытаюсь получить пересечение двух массивов с помощью метода Intersect, используя C# в приложении Windows. Я работал над этим весь день, но это не дало мне никакого результата. Любая помощь будет очень признательна. Спасибо.

Что я уже пробовал:

private void button5_Click(object sender, EventArgs e)
        {
            string[] A = textBox1.Text.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
            string[] B = textBox2.Text.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);

            IEnumerable<string> res = from set in A.Intersect(B) select set;

            foreach (var str in res)
            {
                result.Text = str;
            }
        }

Richard Deeming

Мы не можем ответить на этот вопрос, потому что результат будет зависеть от содержимого ваших двух текстовых полей, которые мы не можем видеть.

Единственная очевидная проблема заключается в том, что вы переписываете значение в result текстовое поле в каждой итерации foreach петля, так что вы всегда будете показывать только последний элемент с перекрестка.

1 Ответов

Рейтинг:
4

OriginalGriff

Если вы попробуете сделать это вот так:

string[] A = "A B D".Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
string[] B = "A C D".Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);

IEnumerable<string> res = from set in A.Intersect(B) select set;

foreach (var str in res)
    {
    Console.WriteLine(str);
    }
Вы получите именно то, что ожидаете:
A
D
Ваш код этого не делает - вы получаете "просто D", потому что внутри цикла вы устанавливаете содержимое текстового поля на определенное значение каждый раз, а затем перезаписываете его при следующем выполнении цикла. Таким образом, Вы получаете "D", а "A" отбрасывается.
Что вы можете сделать, так это добавить каждую строку в свойство TextBox Text, или вы можете сделать это вместо цикла:
result.Text = string.Join(" ", res);
Что даст вам пересечение в виде списка, разделенного пробелом.


Cee08

Я получил результат as только тогда, когда попробовал первый блок кодов. Я также заменил результат.Ул. текст = результат.Текстовая строка.Join(" ", res), но это все равно не дает никакого результата

OriginalGriff

Попробуйте еще раз и используйте консоль.WriteLine - на самом деле, попробуйте мой код точно.
Вы получите
Один
Д
Единственный способ получить A в одиночку-это если "D" не является членом обоих входных наборов.
Когда это сработает, попробуйте сделать то же самое с помощью текстовых полей.

Cee08

Спасибо, это работает. Но как я могу получить пользовательский ввод из текстовых полей и отобразить результат вместо установки значений по умолчанию? Я применил те же коды, используя метод объединения, и он работает просто отлично. У меня есть только эта проблема с пересечением.

OriginalGriff

"Когда у вас это работает, попробуйте то же самое с помощью текстовых полей."
Так что сделай это. Когда вы знаете, что код работает, добавьте переменную обратно - пользовательский ввод.
Если это не сработает, то вы знаете, что то, что вы используете в качестве входных данных, не то, что вы ожидали, поэтому вам нужно внимательно посмотреть на него - я бы предложил использовать отладчик - чтобы выяснить, чем он отличается.

Cee08

Спасибо OriginalGriff. Я попытался заменить string[] A = textBox1.Text.Split(new string[] { "" }, StringSplitOptions.RemoveEmptyEntries) со строкой[] A = textBox1.Text.Split(new Char[] { ',' }) и теперь он работает.

OriginalGriff

Значит, ваш ввод разделен запятыми, а не пробелом? Теперь вы знаете, почему это не сработало!

Кстати: существует перегрузка Split, которая делает ваш код более читабельным, если вам не нужны опции:

string[] A = textBox1.Text.Split(',');


Сделайте себе одолжение тоже - перестаньте использовать имена Visual Studio по умолчанию для всего - вы можете помнить, что "TextBox8" - это номер мобильного телефона сегодня, но когда вам придется изменить его через три недели, вы это сделаете? Используйте описательные имена - например, "tbMobileNo", - и ваш код станет легче читать, более самодокументируемым, легче поддерживать - и на удивление быстрее кодировать, потому что Intellisense может добраться до "tbMobile" за три нажатия клавиш, где "TextBox8" занимает размышление и 8 нажатий клавиш...

Cee08

Я приму это к сведению, спасибо за ваше терпение :)

OriginalGriff

Всегда пожалуйста!