0

linq 查询中使用的 TAKE 关键字是否会导致该 linq 查询的执行在评估时短路,或者是否有任何方法导致短路?

value = (From DataRow In MyDataTable Where DataRow.Item("MyColumn").ToString = "Y" Take 1).Any
4

2 回答 2

1

两个都。Take 将只获取前 1 条记录,然后 any 将在找到匹配的记录后立即短路(但由于 take 最多只有 1 条记录)。您可以安全地移除 Take 1 并获得相同的性能。

于 2016-12-02T16:57:59.373 回答
0

术语短路在这里并不适用,因为它是关于布尔评估的。在此处查看一些示例。它不适用,因为Take不返回布尔值。

您可能要问的是:Take如果Any是下一个方法,是否执行?从逻辑上讲,如果也被执行,Take则可以跳过,因为在找到第一个匹配项后也会停止。AnyAny

但是,我们只是在看几个连续调用的扩展方法:

value = MyDataTable.AsEnumerable() _
       .Where(Function(DateRow) DataRow.Item("MyColumn").ToString = "Y") _
       .(Take(1)) _
       .Any()

如此Take运行,然后接下来发生的任何方法,在这种情况下Any。怎么会Take知道它不需要运行?如果您从源代码构建自己的扩展方法并添加跟踪语句,则可以轻松证明这一点。

也许一个潜在的问题是,性能方面重要吗?好吧,这是两次迭代(顶部)与一次,试图阻止它将是一个微优化。

于 2016-12-03T12:00:53.970 回答