LINQ实现 - 一个循环还是多个?

Mar*_*lds 5 c# linq

说我有类似的东西 collection.Select(..).Where(...).Sum(...)

LINQ引擎会在集合上执行1个或多个循环吗?

jas*_*son 8

Sum将消耗过滤器Where的输出Select,这将消耗投影的输出,这将消耗collection.Sum将走过一次过滤后的序列,这将使投影走一次,这将走collection一次.因此,集合将重复一次.

这是一个可爱的实验,你可以做到这一点:

class Sequence : IEnumerable<int> {
    public IEnumerator<int> GetEnumerator() {
        for (int i = 0; i < 17; i++) {
            Console.WriteLine(i);
            yield return i;
        }
    }

    IEnumerator IEnumerable.GetEnumerator() {
        return GetEnumerator();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

Sequence sequence = new Sequence();
int sum = sequence.Select(x => 2 * x).Where(x => x % 4 == 0).Sum();
Console.WriteLine("Sum is {0}", sum);
Run Code Online (Sandbox Code Playgroud)

输出将是:

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sum is 144
Run Code Online (Sandbox Code Playgroud)

显示sequence只迭代一次.


Sta*_*eXV 2

这三个命令将有一个循环。

如果您想了解更多信息,我推荐Jon Skeet 的博客,他在其中描述了 LINQ to Objects 的重新实现。

  • 你可以创建一些。有些命令需要运行整个集合,例如 OrderBy()。 (2认同)