2011-01-27 48 views

回答

28

最快(對於一個大集)將是讓他們對Dictionary<TKey,TValue>鍵,並使用它。

SingleFirst做不同的事情; Single總是迭代整個集合,即使它在列表的開始處找到它,所以First通常會比Single更快,因爲它會短路。

23

First將比Single更快,因爲它一旦找到匹配就可以終止。另一方面,這意味着它驗證只有一個項目匹配的謂詞。

Find應該像First一樣快,但便攜性不如它只能在列表上工作。如果你一般使用LINQ,我會嘗試堅持使用LINQ操作符,除非使用替代方法有明顯的好處。

正如馬克所說,如果你打算經常這樣做,你應該使用Dictionary<,>。您可以使用ToDictionary運營商輕鬆地做到這一點:

var dictionary = list.ToDictionary(x => x.Id); 
// Now you can look up by ID really quickly 

顯然創建詞典需要一些時間才能開始,所以你只是想這樣做,如果你多次搜索。

+0

@usr提出了一個有趣的觀點。如果他是正確的,使用Find()會不會更快? – Coops 2013-04-16 11:54:33

2

他們是不同的方法。 FindList<T>中定義,它幾乎與First相同,它在Enumerable.cs中定義爲IEnumerable<T>上的擴展方法。如果找到條件項目(不需要遍歷整個集合),它們都會返回,所以它們的性能差別很小。

雖然Single返回條件項目,並且還保證此項目是唯一符合條件的項目。所以在大多數情況下,SingleFirst/Find慢,因爲它需要遍歷集合。

1

作爲對現有答案的補充:List.Find比IEnumerable快得多。首先,因爲第一個可以在List的內部數組上運行。後者必須經過IList界面。

相關問題