2010-01-15 50 views
3

我正在调查操作的性能。我正在迭代集合中的一部分项目。我使用Linq查询过滤这个集合。它基本上是这样的:是Linq“哪里”比Linq“选择”更贵?

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

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

+1

的问题是基于选择和凡达到同样的事情,但事实并非如此,所以他们的表现的问题是没有实际意义的假设。 – Guffa 2010-01-15 08:50:28

+0

在发布这个问题之前应该已经得到了我的事实。道歉并感谢您的答复和评论。 – Corpsekicker 2010-01-15 08:57:20

回答

9

Where和Select当然不会达到同样的效果。

Where基于谓词过滤枚举。致电的结果IEnumerable<T>的地址是IEnumerable<T>

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

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

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

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

5

Where filters,Select maps。两件完全不同的事情。

+0

这实际上并没有回答这个问题。 – Joey 2010-01-15 08:41:35

+4

@Johannes:这个问题断言了一些错误的东西。这纠正了这些问题,基本上将问题标记为无效。是的,它可能应该是一个评论,但不是一个完全无效的答案。 – cjk 2010-01-15 08:46:52

+2

@Johannes:不是吗?不同之处在于他们做了不同的事情,所以显然更好的使用的是实际做你想做的事情。 – Guffa 2010-01-15 08:47:38

2

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

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

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

所以提个醒,性能差异是基于给定的选择代表的复杂性。但正如其他人所说,他们有不同的目的。