【发布时间】:2010-10-26 18:34:30
【问题描述】:
我可以将它们转换为列表并使用带有索引的常规 for 循环,但我想知道是否有办法将它们保持为 IEnumerables。
【问题讨论】:
标签: c# foreach ienumerable
我可以将它们转换为列表并使用带有索引的常规 for 循环,但我想知道是否有办法将它们保持为 IEnumerables。
【问题讨论】:
标签: c# foreach ienumerable
我认为您需要 .NET 4.0 的新 Zip 功能。 Eric Lippert blogged about it recently 并包含了一个简单的实现形式。
它也在MoreLINQ 和Zip.cs 中,如果序列长度不同,则允许使用不同的选项。 “默认”是像 .NET 4.0 一样,当任一序列用完元素时停止。替代方法是填充较短的序列或抛出异常。
【讨论】:
默认情况下没有办法,但添加扩展方法使其更容易一点并不难。为了简洁起见,我排除了一些错误检查以确保它们的长度相同。
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
});
【讨论】: