簡體   English   中英

使用引用類型的值作為字典鍵必須做什么?

[英]What must be done to use the value of a reference type as a dictionary key?

假設我有一個T類,我想用它作為Dictionary<T,U>集合中的一個鍵。

我必須在T實現什么才能使這些鍵基於T而不是T引用的值?

我希望它只是GetHashCode()

您必須實現GetHashCode()和Equals()。

Dictionary是一個Hashtable,所以你可能想讀這個: Equals / GetHashCode的陷阱 - 哈希表是如何工作的?

如果你沒有在字典構造函數中傳遞任何IEqualityComparer<T> ,它將使用由MSDN定義的EqualityComparer<T>.Default

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

因此實現IEquatable<T>將是我的選擇(如果你實現它,無論如何IEquatable<T>意義覆蓋EqualsGetHashCode )。

要么實現EqualsGetHashCode 要么創建一個適當的IEqualityComparer<T> ,它具有正確的映射相等匹配形式。

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

您需要覆蓋Equals(object obj) 在修改Equals時,始終需要實現GetHashCode 在MSDN上閱讀這篇文章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM