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只迭代一次.
这三个命令将有一个循环。
如果您想了解更多信息,我推荐Jon Skeet 的博客,他在其中描述了 LINQ to Objects 的重新实现。
| 归档时间: |
|
| 查看次数: |
617 次 |
| 最近记录: |