有没有办法在C#中的2个IEnumerable中对每个元素对做一个foreach?

Dav*_*vy8 2 c# ienumerable foreach

我可以将它们转换为列表,只使用带索引的常规for循环,但我想知道是否有办法将它们保持为IEnumerables.

Jon*_*eet 6

我想你想要.NET 4.0的新Zip功能.Eric Lippert 最近在博客上发表了一篇文章,其中包括一个简单的实现方式.

它也在ZipLs中的MoreLINQ中,如果序列长度不同,它允许不同的选项."默认"就像.NET 4.0一样,当任何一个序列耗尽元素时停止.替代方案是填充较短的序列或抛出异常.


Jar*_*Par 5

默认情况下没有办法,但添加扩展方法以使其更容易一点并不困难.我排除了一些错误检查,以确保它们的长度相同,以简洁.

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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在您可以执行以下操作

var list = GetSomeList();
var otherList = GetSomeOtherList();
list.ForEachPair(otherList, (x,y) => 
{
   // Loop code here
});
Run Code Online (Sandbox Code Playgroud)