【问题标题】:Using foreach loop to iterate through two lists使用 foreach 循环遍历两个列表
【发布时间】:2011-05-25 22:32:03
【问题描述】:

我有两个列表

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

【问题讨论】:

  • 你想同时迭代它们,还是先一个然后另一个?

标签: c# .net


【解决方案1】:
foreach(object o in a.Concat(b)) {
 o.DoSomething();
}

【讨论】:

  • 谢谢,但是如果我使用的 Collection 不支持 Concat 怎么办?
  • 如果您使用 List 和 .Net 3.5 或更高版本,您确实有 Concat 方法。只需添加using System.Linq
【解决方案2】:

如果你想单独遍历它们,那么你可以使用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 个 2 二 3 三

【讨论】:

    【解决方案3】:
    foreach(object o in a.Concat(b)) {
     o.DoSomething();
    }
    

    【讨论】:

      【解决方案4】:

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

      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
      }
      

      【讨论】:

      • 你可以用(a.Count &gt; b.Count ? a.Count : b.Count)代替Math.Max(a.Count, b.Count)
      【解决方案5】:

      如果你想同时迭代两个相同长度的列表(特别是在测试中比较两个列表的场景中),我认为 for 循环更有意义:

      for (int i = 0; i < list1.Count; i++) {
          if (list1[i] == list2[i]) {
              // Do something
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-13
        • 2014-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多