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

And*_*ite 14 c# linq coding-style

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

if(X)
{
  foreach(var Y in myList.Where(z => z == 1)
  {
  }
} 
Run Code Online (Sandbox Code Playgroud)

一些代码中的构造
正在替换它

foreach(var Y in myList.Where(z => X && z == 1) { }
Run Code Online (Sandbox Code Playgroud)

疯?

它可能不太可读,但编译器会优化它以使它几乎相同的代码吗?

And*_*are 19

不,你的第一个版本更好更快.第二个版本将评估X序列中的每个元素X是否为真.

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


Ian*_*ose 5

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

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

Linq没有内置的优化,它与您对数据库中的SQL查询重写器的期望值接近.