可能是一个愚蠢的问题,但我有很多:
if(X)
{
foreach(var Y in myList.Where(z => z == 1)
{
}
}
在一些代码中构造
正在用
foreach(var Y in myList.Where(z => X && z == 1) { }
疯狂?
它的可读性可能较低,但是编译器是否会对其进行优化以使其成为相同的代码?
答案 0 :(得分:19)
不,你的第一个版本更好更快。只要X
为真,第二个版本就会为序列中的每个元素评估X
。
你应该坚持使用第一个版本。
答案 1 :(得分:5)
当x为false时,第二个选项会慢得多,因为当你知道检查总是会失败时,linq会检查列表中的所有项目。
编译器优化器无法撤消您的损坏。这种优化级别通常只能在函数式语言中使用,因为编译器很难跟踪可能的副作用。
Linq没有内置的优化功能,可以接近您对数据库中SQL查询重写器的期望。
答案 2 :(得分:1)
他们不会编译成相同的代码。在第二个版本中,X
被多次评估,并枚举myList
。最糟糕的情况是评估X
更改某些内容,并且您具有不可预测的功能。