2010-07-31 57 views
13

我想知道什麼是更好的使用。LINQ秩序通過與IComparer

IComparer類和比較方法的排序或列表上的LINQ orderby。兩者都可以正常工作,但哪個更適合大型列表。

回答

9

我會選擇LINQ有兩個原因。

  • LINQ查詢通常更短,更易於閱讀。
  • 如果您確實擁有大量元素,Linq還可以通過使用PLinq爲您提供scale out to multiple CPU cores的能力,這可能會顯着幫助您。

如果考慮到OrderBy子句中的lambda表達式編譯爲一個函數,那麼我認爲單線程實現的性能大致相似 - 這實際上是通過實現IComparer得到的。這就是說,通過改變排序算法以適應數據已經排序的方式,而不是通過改變比較方法,你可能會獲得更多的性能提升。但是,我願意今天早上打賭我的咖啡,OrderBy在你的Linq語句中使用了Quicksort的實現,所以它在一般情況下可能相當不錯。

4

我更喜歡在所有基於集合的操作中使用LINQ。這裏的優點是我不必過多地使用集合的類型(OrderBy在IEnumerable上工作)。

如果您有IList<T>無論如何,那麼List.Sort可能會更快。

無論如何,我不會擔心之前有一個成熟的(即測得的)性能問題

2

我認爲語義上兩者有很大的不同,IComparer的界面允許您定義如何你的類型自然排序,排序依據爲您提供了一種通過某些特定鍵排序對象的方法,例如給定Person對象列表,對於查詢A按名字對列表進行排序,對於查詢B按Age排序列表。

LINQ爲您提供了更大的靈活性,但是因爲OrderBy需要一個Func,它接受您的對象類型並返回一個用於排序的鍵,無論您返回哪個鍵仍需要實現IComparer接口。

就性能而言,根據您在比較方法中所做的操作,我認爲這兩種方法之間可能差別很小,儘管最好僅針對您的類型進行測試。

+0

thx all for answers。 – senzacionale 2010-07-31 17:01:52