使用Foreach.Where替换if(x)Foreach()(x)

时间:2010-09-08 15:01:38

标签: c# linq coding-style

可能是一个愚蠢的问题,但我有很多:

if(X)
{
  foreach(var Y in myList.Where(z => z == 1)
  {
  }
} 

在一些代码中构造
正在用

替换它
foreach(var Y in myList.Where(z => X && z == 1) { }

疯狂?

它的可读性可能较低,但是编译器是否会对其进行优化以使其成为相同的代码?

3 个答案:

答案 0 :(得分:19)

不,你的第一个版本更好更快。只要X为真,第二个版本就会为序列中的每个元素评估X

你应该坚持使用第一个版本。

答案 1 :(得分:5)

当x为false时,第二个选项会慢得多,因为当你知道检查总是会失败时,linq会检查列表中的所有项目。

编译器优化器无法撤消您的损坏。这种优化级别通常只能在函数式语言中使用,因为编译器很难跟踪可能的副作用。

Linq没有内置的优化功能,可以接近您对数据库中SQL查询重写器的期望。

答案 2 :(得分:1)

他们不会编译成相同的代码。在第二个版本中,X被多次评估,并枚举myList。最糟糕的情况是评估X更改某些内容,并且您具有不可预测的功能。