使用ToArray()
等方法强制评估LINQ查询的公认惯例是什么,是否有用于组合最佳查询链的一般启发式方法?我经常尝试在一次通过中完成所有事情,因为在这些情况下我注意到AsParallel()
在加速计算方面做得非常好。如果查询执行的计算没有副作用,但是需要多次传递来获取正确的数据是强制计算ToArray()
正确的方法还是最好让查询保持懒惰状态?
答案 0 :(得分:2)
答案 1 :(得分:2)
将查询保持为懒惰形式,直到您开始多次评估查询为止,或者如果您需要以其他形式或更早地评估查询,您将面临更改其值的闭包中捕获的变量的危险。
当查询包含您希望避免多次执行的复杂投影时(例如,为包含大量元素的序列构建复杂对象),您可能需要评估。在这种情况下,评估一次并多次迭代会更加安全。
如果您想要返回结果或将其传递给需要特定类型集合的其他API,则可能需要使用其他形式的结果。
如果查询捕获范围不是本地的变量,您可能需要或需要阻止访问已修改的闭包。在实际评估查询之前,您将面临其他代码“背后”更改其值的危险;当评估发生时,它将使用这些值而不是构造查询时存在的值。 (但是,可以通过在具有本地范围的另一个变量中复制这些值来解决此问题。)
答案 2 :(得分:1)