2014-11-02 64 views
11

什麼是C#中的最佳實踐,從4.0版本寫一個比較器類時開始:我們應該擴大的Comparer <T>或實現的IComparer <T>

一個。我們應該從Comparer抽象類繼承嗎?或

b。我們是否應該實現IComparer接口。

有什麼優點和缺點?

+0

implement'IComparer' – mihai 2014-11-02 10:55:10

+0

我認爲,那實現'IComparer'是更好的方法,因爲它可能會在以後在LINQ中使用。 – W92 2014-11-02 10:58:35

+0

從比較器繼承。 Msdn告訴你爲什麼。通過這樣做你會得到默認值。比較行爲 – 2014-11-02 10:59:34

回答

12

我建議您擴展Comparer<T>類,而不是像Microsoft一樣實現IComparer<T>接口(請參見下面的第一個參考)。

現在,如果您希望自己的對象(無論T是什麼)能夠與自身進行比較,則可以實現IComparable接口(請參見下面的第二個參考)。


來源:http://msdn.microsoft.com/en-us/library/8ehhxeaf(v=vs.110).aspxIComparer<T>

我們建議您從Comparer<T>類,而不是實現IComparer接口派生,因爲Comparer<T>類提供了IComparer.Compare方法和的顯式接口實現Default獲取對象的默認比較器的屬性。

來源:http://msdn.microsoft.com/en-us/library/cfttsh47(v=vs.110).aspxComparer<T>

派生從這個類提供IComparer<T>接口與集合類如SortedList<TKey, TValue>SortedDictionary<TKey, TValue>泛型類使用的自定義實現。 從比較器類繼承和實現的System.IComparable接口之間的區別如下:

  • 要指定兩個對象應該是默認相比,實現你們班System.IComparable接口。這確保了排序操作將使用您提供的默認比較代碼。
  • 要定義要使用的比較器而不是默認比較器,請從Comparer類派生。然後,您可以在將比較器作爲參數的排序操作中使用此比較器。
+0

_「從這個類派生」_ - 哪個類?我認爲你的意思是'Comparer '? – MickyD 2014-11-02 11:03:25

+0

這是來自MSDN頁面'Comparer '的直接引用,所以是的。 – 2014-11-02 11:06:31

+3

我意識到,但是閱讀你的答案並不清楚你在說什麼。我必須點擊鏈接才能找到。你應該開始說:「我推薦'Comparer Class' ...」。 _ [你的答案在另一座城堡中:何時答案不是答案?](http://meta.stackexchange.com/questions/225370/your-answer-is-in-another-castle-when-is-an -answer-not-answer)_ – MickyD 2014-11-02 11:09:44

1

this article on MSDN

我們建議您從比較器類,而不是實現IComparer接口派生,因爲比較器類提供了IComparer.Compare方法和默認的顯式接口實現屬性,獲取對象的默認比較器。

相關問題