Использование цикла foreach для перебора двух списков - PullRequest
15 голосов
/ 15 декабря 2010

У меня есть два списка

List<object> a = new List<object>();
List<object> b = new List<object>();

Теперь я хочу перебрать элементы обоих списков. Я мог бы сделать это, написав цикл foreach для каждого списка. Но возможно ли сделать что-то подобное?

foreach(object o in a, b) {
 o.DoSomething();
}

Было бы также хорошо, если бы было возможно что-то подобное:

foreach (object o in a && b) {
   o.DoSomething();
}

Ответы [ 5 ]

24 голосов
/ 15 декабря 2010
foreach(object o in a.Concat(b)) {
 o.DoSomething();
}
13 голосов
/ 15 декабря 2010

Если вы хотите просмотреть их по отдельности, вы можете использовать Enumerable.Concat, как уже было указано.

Если вы хотите выполнять итерации по обоим спискам одновременно, имея доступ к одному элементу из каждого внутри вашего цикла, то в .NET 4.0 есть метод Enumerable.Zip, который вы можете использовать.

int[] numbers = { 1, 2, 3, 4 };
string[] words = { "one", "two", "three" };

var numbersAndWords = numbers.Zip(words, (first, second) => first + " " + second);

foreach (var item in numbersAndWords)
{
    Console.WriteLine(item);
}

Результат:

1 one
2 two
3 three
6 голосов
/ 15 декабря 2010
foreach(object o in a.Concat(b)) {
 o.DoSomething();
}
1 голос
/ 12 августа 2016

Если вы хотите одновременно выполнить итерацию по двум спискам одинаковой длины (особенно в сценариях, таких как сравнение двух списков при тестировании), я думаю, цикл for имеет больше смысла:

1 голос
/ 15 декабря 2010

Это еще один способ сделать это:

for (int i = 0; i < (a.Count > b.Count ? a.Count : b.Count); i++)
{
    object objA, objB;
    if (i < a.Count) objA = a[i];
    if (i < b.Count) objB = b[i];

    // Do stuff
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...