使用foreach循环遍历两个列表

22

我有两个列表

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();
}

3
您想同时迭代它们,还是先一个再另一个? - Mark Byers
6个回答

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

谢谢,但是如果我使用的集合不支持Concat怎么办? - RoflcoptrException
4
如果您正在使用List<T> 和 .Net版本3.5或更高版本,则确实有Concat方法可用。只需添加 using System.Linq - Itay Karo

15
如果你想要逐个迭代它们,那么你可以使用已经被指出的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
foreach(object o in a.Concat(b)) {
 o.DoSomething();
}

1
如果您想同时迭代两个长度相同的列表(尤其是在测试中比较两个列表的场景),我认为使用for循环更有意义:
for (int i = 0; i < list1.Count; i++) {
    if (list1[i] == list2[i]) {
        // Do something
    }
}

1

这是另一种你可以做到的方式:

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
}

2
你可以使用 Math.Max(a.Count, b.Count) 代替 (a.Count > b.Count ? a.Count : b.Count) - CaffGeek

0

我们可以简单地使用for循环来实现

 int[] numbers = { 1, 2, 3, 4 };
    string[] words = { "one", "two", "three" };
    
     for (int i = 0; i < numbers .Count; i++)
                {
    var list1=numbers [i];
    var list 2=words[i];
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接