2010-05-21 72 views

回答

3

如果不字典中的構造函數傳遞任何IEqualityComparer<T>,它將使用EqualityComparer<T>.Default這是由MSDN定義:

默認屬性檢查 類型T是否實現System.IEquatable(效應的T ) 接口,如果是,則返回 EqualityComparer(Of T) 使用該實現。否則, 它返回使用由T.提供的 的Object.Equals和Object.GetHashCode的覆蓋的EqualityComparer(Of T)已

所以實施IEquatable<T>將是我的選擇(如果你實現它也是有意義無論如何覆寫EqualsGetHashCode)。

+0

我不會推薦任何可繼承類型實現IEquatable ,因爲如果派生類型重寫Object.Equals Object)和/或Object.GetHashCode(Object)並且IEquatable 的實現不會調用這些覆蓋;因爲通過強制轉換爲Object來調用這些覆蓋會破壞使用通用接口所獲得的任何優勢,所以實現它毫無意義。 – supercat 2011-08-23 19:24:34

3

要麼實施EqualsGetHashCode創建一個適當的IEqualityComparer<T>具有平等的權利形式的地圖匹配。

我更喜歡IEqualityComparer<T>路線:在很多情況下,沒有一種顯然是正確的平等形式 - 您希望根據具體情況以不同方式將對象視爲平等。在這種情況下,自定義相等比較器就是您所需要的。當然,如果是自然平等操作,那麼在類型本身中實現IEquatable<T>是有意義的......如果可以的話。 (IEqualityComparer<T>的另一個好處是你可以爲你無法控制的類型實現它。)

相關問題