2010-01-15 58 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); 
} 

所以提個醒,性能差異是基於給定的選擇代表的複雜性。但正如其他人所說,他們有不同的目的。