我可以将它们转换为列表并使用带有索引的常规 for 循环,但我想知道是否有办法将它们保持为 IEnumerables。
问问题
140 次
2 回答
6
我认为您想要 .NET 4.0 的新 Zip 功能。Eric Lippert最近发表了一篇关于它的博客,并包含了一个简单的实现形式。
它也在MoreLINQ的Zip.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 回答