链接LINQ语句会导致多次迭代吗?

时间:2013-08-23 17:02:27

标签: performance linq

链接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的结果是第二次进行求和?

2 个答案:

答案 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)