链接LINQ语句会导致多次迭代吗?
例如,让我说我想用where子句过滤我的数据,然后在匹配上做一个总和:
int total = data.Where(item => item.Alpha == 1 && item.Beta == 2)
.Sum(item => item.Qty);
这会导致数据的单个交互,这样就等于这个吗?
int total = 0;
foreach (var item in data)
if (item.Alpha == 1 && item.Beta == 2)
total += 1;
或者,它是否会迭代data
一次,而where
的结果是第二次进行求和?
答案 0 :(得分:4)
LINQ中的语句是流式传输的,因此Where
实际上不会运行,直到Sum
枚举其值。这意味着来自data
的项目将被有效地一次枚举。
基本上,Where
方法会创建一个新的IEnumerable<T>
,但实际上并不会通过data
进行枚举。 Sum
对来自foreach
的{{1}} IEnumerable<T>
Where
进行Where
,而{{1}}依次通过{{1}}序列提取项目。
答案 1 :(得分:3)
是的,LINQ查询只会导致一次迭代而不是源集合。
它是如何工作的? Sum
当时询问一个元素,Where
(源集合)也是如此。因此,当Sum
需要下一个元素时,它会调用从MoveNext
获取的Enumerator<T>
上的Where
,其实现如下:
foreach(var item in source)
if(predicate(item))
yield return item;
要了解它,您应该阅读有关迭代器的信息:Iterators (C# and Visual Basic)