Ответ 1
foreach(object o in a.Concat(b)) {
o.DoSomething();
}
У меня есть два списка
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();
}
foreach(object o in a.Concat(b)) {
o.DoSomething();
}
Если вы хотите итерации через них индивидуально, вы можете использовать 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
foreach(object o in a.Concat(b)) {
o.DoSomething();
}
Это можно сделать другим способом:
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
}
Если вы хотите одновременно перебирать два списка одинаковой длины (особенно в сценариях, таких как сравнение двух списков при тестировании), я думаю, что для цикла имеет смысл:
for (int i = 0; i < list1.Count; i++) {
if (list1[i] == list2[i]) {
// Do something
}
}