假設我有一個類T
,我想用它作爲Dictionary<T,U>
集合中的關鍵字。使用引用類型的值作爲字典鍵必須做什麼?
我必須在T
中執行哪些操作,以便這些鍵基於值T
而不是T
的引用?我希望它只是GetHashCode()
。
假設我有一個類T
,我想用它作爲Dictionary<T,U>
集合中的關鍵字。使用引用類型的值作爲字典鍵必須做什麼?
我必須在T
中執行哪些操作,以便這些鍵基於值T
而不是T
的引用?我希望它只是GetHashCode()
。
您必須實現GetHashCode()和Equals()。
字典是適用於下面一個Hashtable,所以你可能需要閱讀此:Pitfalls Of Equals/GetHashCode – How Does A Hash Table Work?
你需要重寫Equals(object obj)
。當您修改Equals
時,始終希望您實施GetHashCode
。在MSDN處閱讀article。
如果不字典中的構造函數傳遞任何IEqualityComparer<T>
,它將使用EqualityComparer<T>.Default
這是由MSDN定義:
默認屬性檢查 類型T是否實現System.IEquatable(效應的T ) 接口,如果是,則返回 EqualityComparer(Of T) 使用該實現。否則, 它返回使用由T.提供的 的Object.Equals和Object.GetHashCode的覆蓋的EqualityComparer(Of T)已
所以實施IEquatable<T>
將是我的選擇(如果你實現它也是有意義無論如何覆寫Equals
和GetHashCode
)。
要麼實施Equals
和GetHashCode
或創建一個適當的IEqualityComparer<T>
具有平等的權利形式的地圖匹配。
我更喜歡IEqualityComparer<T>
路線:在很多情況下,沒有一種顯然是正確的平等形式 - 您希望根據具體情況以不同方式將對象視爲平等。在這種情況下,自定義相等比較器就是您所需要的。當然,如果是是自然平等操作,那麼在類型本身中實現IEquatable<T>
是有意義的......如果可以的話。 (IEqualityComparer<T>
的另一個好處是你可以爲你無法控制的類型實現它。)
我不會推薦任何可繼承類型實現IEquatable,因爲如果派生類型重寫Object.Equals Object)和/或Object.GetHashCode(Object)並且IEquatable 的實現不會調用這些覆蓋;因爲通過強制轉換爲Object來調用這些覆蓋會破壞使用通用接口所獲得的任何優勢,所以實現它毫無意義。 –
supercat
2011-08-23 19:24:34