【问题标题】:Is Linq "Where" more expensive than Linq "Select"?Linq “Where” 比 Linq “Select” 贵吗?
【发布时间】:2011-01-05 10:23:55
【问题描述】:

我正在调查一项行动的绩效。我正在迭代集合中的项目子集。我使用 Linq 查询过滤这个集合。基本上是这样的:

var filteredItems = items.Where(x => x.PropertyToFilterOn == filterValue);
foreach (var filteredItem in filteredItems)
{
    // do something to the filtered item
}

如果我使用 Select 而不是 Where 我会达到同样的效果。哪个更好用,有什么区别?

【问题讨论】:

  • 这个问题是基于 Select 和 Where 实现相同目标的假设,但事实并非如此,因此它们的性能问题没有实际意义。
  • 在发布这个问题之前应该了解我的事实。很抱歉并感谢您的回答和 cmets。

标签: c# linq performance select collections


【解决方案1】:

Where 过滤器,Select 映射。两种完全不同的东西。

【讨论】:

  • 这实际上并没有回答问题。
  • @Johannes:这个问题断言了一些错误。这纠正了错误,基本上将问题标记为无效。是的,它可能应该是一个评论,但不是一个完全无效的答案。
  • @Johannes:不是吗?不同之处在于它们做不同的事情,所以显然更好的使用是实际做你想做的事情。
【解决方案2】:

比较后台代码在理论上是如何工作的:

// Where
foreach(var x in items)
{
    if (x.PropertyToFilterOn == filterValue)
        yield return x;
}

// Select
foreach (var x in items)
{
    yield return selector(x);
}

请注意,性能差异取决于给定选择器委托的复杂性。但正如其他人所说,它们有不同的用途。

【讨论】:

    【解决方案3】:

    Where 和 Select 肯定不会达到同样的效果。

    Where 根据谓词过滤可枚举。在IEnumerable<T> 上调用Where 的结果是IEnumerable<T>

    Select 是一种投影 - 它允许您映射可枚举,例如仅选择枚举类型属性的子集,或完全基于枚举类型的值构造不同的对象。

    where 和 select 都至少为 O(n) - 因为必须访问枚举中的每个项目才能执行投影或过滤。

    以下关于标准查询运算符的文档是一个很好的参考。

    http://download.microsoft.com/download/5/8/6/5868081c-68aa-40de-9a45-a3803d8134b8/standard_query_operators.doc

    【讨论】:

      猜你喜欢
      • 2016-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-18
      • 1970-01-01
      相关资源
      最近更新 更多