2011-01-12 85 views
2

用多種方法來比較類中包含的數據,在自定義類中覆蓋CompareTo()方法的方法是什麼?我試圖實現IComparable(Of T),所以我實現了一些基準接口。目前還沒有計劃進行任何分類,但如果需要的話,這可以節省我的時間。當有多種方法比較兩個相同類型的對象時,覆蓋CompareTo?

閱讀MSDN主要指出,如果對象相等,則返回0;如果obj1小於obj2,則返回-1;或者1是obj1大於obj2。但是這很簡單。

考慮一個IPv4地址(這是我在我的課上實現的)。有兩個主要的數字要考慮 - IP地址本身和CIDR。假設IPv4地址本身的CIDR是/ 32,所以在這種情況下,在CompareTo方法中,我可以直接比較地址以確定一個是大於還是小於另一個。但是當CIDR不同時,事情變得棘手。

假設obj1是10.0.0.0/8而obj2是192.168.75.0/24。我可以用多種方法比較這兩個地址。我可以忽略CIDR,仍然認爲obj2大於obj1。我可以根據它們的CIDR來比較它們,這將比較網絡的大小(並且a/8將很容易地勝過a/24)。我可以在它們的數字地址和它們的CIDR上比較它們,關於機會obj2實際上是內部的由obj1定義的網絡。

用來處理這種情況的方法是什麼?我可以定義兩個方法,超載,這樣一個人會評估一個地址相對於另一個地址,第二個會評估整個網絡的大小? .NET框架將如何被告知要使用哪一個,取決於人們可能想要如何對數組進行排序?或者做一些其他功能,依靠CompareTo()

回答

3

對於CompareTo,您應該使用表示特定類型的默認正常排序順序的比較。例如,在你給出的例子中,我可能期望它首先在地址上排序,然後在子網大小上排序。

但是對於沒有明顯的「默認」排序順序或有多種比較方式的情況(例如比較字符串時區分大小寫),推薦的方法是使用IComparer<T>。這將是一個單獨的對象,可以比較兩個類型的實例。例如,一個AddressComparer或SubnetComparer。你甚至可以使它們成爲StringComparer所做類的靜態屬性。

幾乎所有采用IComparable類型的方法都應該有一個重載,允許您指定一個IComparer來代替使用。你不必兩者都實現,但如果它是有道理的,那就去做吧。這樣,您可以在需要時指定特定的比較器,或使用類型的默認內置IComparable邏輯。

+1

+1。有趣的事實:在.NET框架中使用的「比較器」一詞甚至不是真正的單詞......它應該被稱爲「比較器」。 – Mehrdad 2011-01-12 05:07:51

相關問題