【问题标题】:Replacing if(x) Foreach() with Foreach.Where(x)用 Foreach.Where(x) 替换 if(x) Foreach()
【发布时间】:2010-09-08 15:01:37
【问题描述】:

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

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

在一些代码中构造
将其替换为

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

疯了吗?

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

【问题讨论】:

  • 避免?为什么要避免这种情况?

标签: c# linq coding-style


【解决方案1】:

不,您的第一个版本更好更快。当X 为真时,第二个版本将为序列中的每个元素评估X

你应该坚持第一个版本。

【讨论】:

    【解决方案2】:

    当 x 为 false 时,第二个选项会慢很多,因为当您知道检查将始终失败时,您正在让 linq 检查列表中的所有项目。

    编译器优化器将无法恢复您的损坏。这种优化水平通常只能在函数式语言中实现,因为编译器很难跟踪可能的副作用。

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

    【讨论】:

      【解决方案3】:

      它们不会编译成相同的代码。在第二个版本中,X 被多次评估,myList 被枚举。最坏的情况是评估 X 改变了一些东西,并且你有不可预测的功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-18
        • 1970-01-01
        • 1970-01-01
        • 2019-08-09
        • 2013-12-23
        • 2021-01-01
        相关资源
        最近更新 更多