C# “是林克吗?”;其中;比Linq“更贵”;选择";?

C# “是林克吗?”;其中;比Linq“更贵”;选择";?,c#,linq,performance,select,collections,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 } 如果我使用选择而不是Where,我也能达到同样的效果。使用哪一

我正在调查一次行动的表现。我正在迭代集合中的一个子集。我使用Linq查询筛选此集合。基本上是这样的:

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

如果我使用
选择
而不是
Where
,我也能达到同样的效果。使用哪一种更好,有什么区别?

在哪里过滤,选择地图。两件完全不同的事情。

比较背景代码在理论上的工作方式:

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

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

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

Where和Select肯定不能达到相同的目的

其中
基于谓词过滤可枚举项。调用Where on
IEnumerable
的结果是
IEnumerable

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

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

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


这实际上并不能回答问题。@Johannes:这个问题肯定出了问题。这纠正了以往的错误,实质上是将问题标记为无效。是的,这可能是一个评论,但这不是一个完全无效的答案。@Johannes:不是吗?区别在于他们做的事情不同,所以显然更好的选择是真正做你想做的事情。这个问题是基于这样的假设,即选择和何处实现了相同的事情,但这不是真的,所以他们的表现问题是没有意义的。在发布这个问题之前,我应该先了解我的事实。抱歉,感谢您的回答和评论。