2

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

4

2 回答 2

6

我认为您想要 .NET 4.0 的新 Zip 功能。Eric Lippert最近发表了一篇关于它的博客,并包含了一个简单的实现形式。

它也在MoreLINQZip.cs中,如果序列的长度不同,它允许使用不同的选项。“默认”是像 .NET 4.0 一样,当任一序列用完元素时停止。替代方法是填充较短的序列或抛出异常。

于 2009-05-16T20:47:23.067 回答
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);
    }
  }
}

现在您可以执行以下操作

var list = GetSomeList();
var otherList = GetSomeOtherList();
list.ForEachPair(otherList, (x,y) => 
{
   // Loop code here
});
于 2009-05-16T20:48:03.720 回答