什么时候强制LINQ查询评估?

时间:2011-09-23 23:21:22

标签: c# linq c#-4.0 lazy-evaluation deferred-execution

使用ToArray()等方法强制评估LINQ查询的公认惯例是什么,是否有用于组合最佳查询链的一般启发式方法?我经常尝试在一次通过中完成所有事情,因为在这些情况下我注意到AsParallel()在加速计算方面做得非常好。如果查询执行的计算没有副作用,但是需要多次传递来获取正确的数据是强制计算ToArray()正确的方法还是最好让查询保持懒惰状态?

3 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

将查询保持为懒惰形式,直到您开始多次评估查询为止,或者如果您需要以其他形式更早地评估查询,您将面临更改其值的闭包中捕获的变量的危险。

当查询包含您希望避免多次执行的复杂投影时(例如,为包含大量元素的序列构建复杂对象),您可能需要评估。在这种情况下,评估一次并多次迭代会更加安全。

如果您想要返回结果或将其传递给需要特定类型集合的其他API,则可能需要使用其他形式的结果

如果查询捕获范围不是本地的变量,您可能需要或需要阻止访问已修改的闭包。在实际评估查询之前,您将面临其他代码“背后”更改其值的危险;当评估发生时,它将使用这些值而不是构造查询时存在的值。 (但是,可以通过在具有本地范围的另一个变量中复制这些值来解决此问题。)

答案 2 :(得分:1)