цикл foreach из нескольких массивов c # - PullRequest
2 голосов
/ 01 июня 2010

Это должен быть простой вопрос.Все, что я хочу знать, есть ли лучший способ кодирования этого.Я хочу сделать цикл foreach для каждого массива без необходимости повторного объявления цикла foreach.Есть ли способ C # проецирует это?Я думал поместить это в коллекцию ...?

Пожалуйста, критикуйте мой код.

        foreach (TextBox tb in vert)
        {
            if (tb.Text == box.Text)                
                conflicts.Add(tb);                
        }
        foreach (TextBox tb in hort)
        {
            if (tb.Text == box.Text)                
                conflicts.Add(tb);                
        }
        foreach (TextBox tb in cube)
        {
            if (tb.Text == box.Text)
                conflicts.Add(tb);                
        }

Ответы [ 7 ]

12 голосов
/ 01 июня 2010

Вы можете использовать LINQ:

conflicts.AddRange(
    vert.Concat(hort).Concat(cube)
        .Where(tb => tb.Text == box.Text)
); 

Я предполагаю, что conflicts - это List<TextBox>, который имеет метод AddRange.Если это не так, вам нужно будет вызвать Add в (одном) цикле.
Если вы создаете conflicts, (или если он начинается пустым), вы можете вместо этого вызвать .ToList().

2 голосов
/ 01 июня 2010

Другой подход .net 3.5: -

conflicts.AddRange(from textBox in vert.Concat(hort).Concat(cube)
                   where textBox.Text == box.Text
                   select textBox);
1 голос
/ 01 июня 2010

Если вы не можете использовать LINQ по какой-либо причине (и я настоятельно рекомендую вам это сделать), вы можете выполнить поиск в своем массиве одним методом.Например:

public void FindConflicts(IEnumerable<TextBox> tbList, IList<TextBox> conflicts, string test)
{
   foreach(TextBox tb in tbList)
   {
      if(tb.Text == test)
      {
          conflicts.Add(tb);
      }
   }
}

И затем назовите это так:

FindConflicts(vert, conflicts, box.Text);
FindConflicts(hort, conflicts, box.Text);
FindConflicts(cube, conflicts, box.Text);
0 голосов
/ 01 июня 2010

Если вы попытаетесь создать игру судоку (упоминается в комментариях), сначала прочитайте о группе перестановок и комбинаторике. Это поможет вам выбрать более эффективную модель приложения без использования foreach для текстовых полей. Использование ленивых вычислений решает проблему с сокращением объектов, но не улучшает вашу логику.

0 голосов
/ 01 июня 2010

Есть, конечно, много способов написать это, но вы также можете сделать

  foreach (var direction in new[] { vert, hort, cube })
    foreach (TextBox tb in direction)
      if (tb.Text == box.Text)
        conflicts.Add(tb);
0 голосов
/ 01 июня 2010

Вы должны иметь возможность использовать Enumerable.Concat, чтобы склеить их вместе , если вы используете .Net 3.5 или выше.

foreach (TextBox tb in vert.Concat(hort).Concat(cube))
0 голосов
/ 01 июня 2010
var unionResult = vert.Concat(hort).Concat(cube)

foreach(TextBox tb in unionResult)
    if(tb.Text == box.Text)
        conflicts.Add(tb);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...