3

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

4

2 回答 2

5

LINQ 中的语句是流式的,因此在枚举其值Where之前不会真正运行。Sum这意味着来自的项目data将被有效地枚举一次。

基本上,该Where方法创建一个新的IEnumerable<T>,但实际上并没有通过 枚举dataSum对 from执行 a foreachover the IEnumerable<T>from Where,依次将项目Where一次拉过一个序列。

于 2013-08-23T17:05:47.123 回答
4

是的,该 LINQ 查询只会导致源集合上的一次迭代。

这个怎么运作?当时Sum 要求Where一个元素,所以(在源集合上)。所以当Sum需要下一个元素时,它会调用MoveNexttake Enumerator<T>from Where,实现如下:

foreach(var item in source)
    if(predicate(item))
        yield return item;

要进一步了解它,您应该阅读有关迭代器的内容:Iterators (C# and Visual Basic)

于 2013-08-23T17:08:08.860 回答