【发布时间】:2011-06-20 18:57:12
【问题描述】:
假设我有两个(或更多)IEnumerable<T>,其中包含许多元素。每个IEnumerable 都有另一个类型T。列表可能非常长,不应该完全加载到内存中。
IEnumerable<int> ints = getManyInts();
IEnumerable<string> strings = getSomeStrings();
IEnumerable<DateTime> dates = getSomeDates();
我想要做的是遍历这些列表,并为每个步骤获取一个包含一个 int、一个字符串和一个 DateTime 的项目,直到到达最长或最短列表的末尾。两种情况都应该支持(布尔参数最长与最短)。对于较短列表中不可用的每个项目(因为已经到达末尾),我希望使用默认值。
for(Tuple<int,string,DateTime> item in
Foo.Combine<int,string,DateTime>(ints, strings, dates))
{
int i=item.Item1;
string s=item.Item2;
DateTime d=item.Item3;
}
是否可以通过 linq 使用延迟执行来做到这一点? 我知道使用 IEnumerators 直接结合收益回报的解决方案。 见How can I iterate over two IEnumerables simultaneously in .NET 2
【问题讨论】:
-
您正在寻找一个接受两个以上参数的
Zip函数。 -
使用
var result = s1.Zip(s2.Zip(s3, (a,b) => new {a,b}), (a,b) => new {a=a, b=b.a, c=b.b});之类的东西可以轻松做到这一点 -
如果 s2 是最长的列表而 s1 只有很少的元素怎么办?
标签: .net linq performance foreach deferred-execution