Linq“Where”比Linq“Select”更贵吗?

时间:2010-01-15 08:37:46

标签: c# linq performance select collections

我正在研究手术的表现。我正在迭代集合中的一部分项目。我使用Linq查询过滤此集合。它基本上是这样的:

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

如果我使用Select代替Where,我会做同样的事情。哪个更好用,有什么区别?

3 个答案:

答案 0 :(得分:9)

Where和Select肯定没有达到同样的目的。

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

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

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

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

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

答案 1 :(得分:5)

Where过滤器,Select地图。两件完全不同的事情。

答案 2 :(得分:2)

比较理论中的背景代码如何工作:

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

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

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