сравнить элементы в списке в c# - PullRequest
0 голосов
/ 22 января 2020

Я хочу сравнить выбранный элемент комбинированного списка с выбранным элементом другого комбинированного списка. Для этого я зарегистрировал все комбинированные списки в списке и назвал его «panel1kilist». Теперь проблема, с которой я сталкиваюсь, заключается в том, что когда в двух комбинированных списках присутствуют одинаковые элементы. сначала в окне сообщения отображается «не найдено совпадений», а затем - «найдено совпадений». Сначала оно переходит к оператору else внутреннего l oop, а затем к оператору if, любезно помогающему

    private void button1_Click(object sender, EventArgs e)
        {
            bool check = false;
            bool check1 = false;[![in this image you can see that there are two same items but message is showing "no match found"][1]][1]
            try[![after clicking on ok button of message box showing "no match found" this message box shows up][1]][1]
            {
                for (int i = 1; i < panel1kilist.Count; i++)
                {
                    for (int j = i + 1; j < panel1kilist.Count; j++)
                    {
                        if (panel1kilist[i].SelectedItem.ToString() == panel1kilist[j].SelectedItem.ToString())
                        {
                            if (check == false)
                            {
                                MessageBox.Show("match found");
                            }
                            check = true;
                        }

                        else
                        {
                            if (check1 == false)
                            {
                                MessageBox.Show("no match found");
                            }
                            check1 = true;
                        }
                    }
                }
            }
            catch (System.NullReferenceException)
            {
                MessageBox.Show("please fill all the boxes first");
            }


        }

1 Ответ

0 голосов
/ 23 января 2020

Ваш вопрос не совсем ясен, но я все еще пытаюсь помочь вам. Как уже упоминалось в комментариях, в вашем коде есть несколько небольших проблем:

1. Outter for -l oop

for (int i = 1; i < panel1kilist.Count; i++)

Вы определяете i = 1, что означает, что вы пропускаете самый первый элемент в свой panel1kilist, потому что списки и массивы начинаются с индекса 0

2. Использование переменных bool

if (panel1kilist[i].SelectedItem.ToString() == panel1kilist[j].SelectedItem.ToString())
{
     if (check == false)
     {
          MessageBox.Show("match found");
     }
     check = true;
}
else
{
     if (check1 == false)
     {
          MessageBox.Show("no match found");
     }
     check1 = true;
}

Вы определяете переменные bool перед запуском циклов for. Таким образом, всякий раз, когда вы устанавливаете переменные check и check1 в true, условия if check == false и check1 == false никогда больше не вернут true. Таким образом, вы никогда не получите никаких сообщений, кроме самых первых «Соответствие найдено» и «Соответствие не найдено».

3. Мое предлагаемое решение

Используйте foreach-l oop и прерывайте циклы, как только вы нашли совпадение, после того, как циклы просто показывают сообщение. Код:

var matchFound = false;

foreach (var combobox in panel1kilist)
{
     foreach (var comboboxToMatch in panel1kilist.Skip(1))
     {
          if (combobox.SelectedItem.ToString() == comboboxToMatch.SelectedItem.ToString())
          {
               matchFound = true;
               // Stops the inner loop in case of a match
               break;
          }
     }

     // Stops the outer loop in case of a match
     if(matchFound)
     {
          break;
     }
}

if(matchFound)
{
     MessageBox.Show("match found");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...