代码之家  ›  专栏  ›  技术社区  ›  Davy8

有没有办法在c_中的2个IEnumerable的每个元素对上执行foreach?

  •  2
  • Davy8  · 技术社区  · 15 年前

    我可以将它们转换为列表,并使用带有索引的正则for循环,但是我想知道是否有一种方法可以将它们保持为IEnumerable。

    2 回复  |  直到 15 年前
        1
  •  5
  •   Noldorin    15 年前

    默认情况下,没有办法,但添加一个扩展方法并不困难,这样做会更容易一些。为了简洁起见,我排除了一些错误检查,以确保它们的长度相同。

    public static void ForEachPair<T1,T2>(
      this IEnumerable<T1> source1, 
      IEnumerable<T2> source2,
      Action<T1,T2> del) {
      using ( var e1 = source1.GetEnumerator() )
      using ( var e2 = source2.GetEnumerator() ) {
        while ( e1.MoveNext() && e2.MoveNext() ) {
          del(e1.Current, e2.Current);
        }
      }
    }
    

    现在您可以执行以下操作

    var list = GetSomeList();
    var otherList = GetSomeOtherList();
    list.ForEachPair(otherList, (x,y) => 
    {
       // Loop code here
    });
    
        2
  •  6
  •   Jon Skeet    15 年前

    我想您需要.NET 4.0的新zip功能。利珀特 blogged about it recently 包括一个简单的实现形式。

    它也在 MoreLINQ Zip.cs 如果序列长度不同,则允许使用不同的选项。“默认值”的作用类似于.NET 4.0,当两个序列中的任何一个用完元素时都会停止。替代方法是填充较短的序列或抛出异常。