【发布时间】:2010-11-09 05:22:30
【问题描述】:
我正在阅读一篇关于查询表达式如何延迟执行的文章。这是否意味着当我们有这样的集合时:
IEnumerable<int> collection = from i in integers where i % 2 == 0 select i;
每次访问collection都会重新计算?
如果是这样,处理此问题的一般做法是什么?转换成新系列?
还有为什么 C# 设计者会选择这种方式,而不是在第一次访问集合后将结果缓存到集合中?
运行时如何知道collection 的行为方式(延迟执行),不像另一个IEnumerable<T> 我可能使用不延迟执行的List<T> 创建?
编辑:
这样的情况呢:
List<int> ints = new List<int> ( ) { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
var even = from i in ints where i % 2 == 0 select i;
ints.AddRange ( new List<int> ( ) { 10, 20, 30, 40, 50 } );
foreach ( int i in even )
{
Console.WriteLine ( i );
}
输出:
2, 4, 6, 8, 0, 10, 20, 30, 40, 50
通过缓存,行为是否更符合预期?
【问题讨论】:
-
您的想法完全错误。 “偶数”根本不是一个集合。这是一个查询。它是一个代表查询“过滤整数以便您只获得偶数”的对象。就是这样,只是一个代表该查询的对象。无论何时枚举它,查询都会执行。当您这样考虑时,就会清楚为什么没有缓存任何内容:查询结果可能每次都不同,但查询并没有改变。
-
谢谢埃里克。我现在明白了。我没有这样想。
标签: c# .net linq performance collections