假设我有一个T
要用作Dictionary<T,U>
集合中的键的类。
我必须实现什么才能T
使这些键基于值T
而不是T
引用?
我希望它只是GetHashCode()
。
假设我有一个T
要用作Dictionary<T,U>
集合中的键的类。
我必须实现什么才能T
使这些键基于值T
而不是T
引用?
我希望它只是GetHashCode()
。
您必须实现 GetHashCode() 和 Equals()。
字典是封面下的哈希表,因此您可能想阅读以下内容:Equals/GetHashCode 的陷阱 – 哈希表如何工作?
如果您没有IEqualityComparer<T>
在字典构造函数中传递任何内容,它将使用EqualityComparer<T>.Default
MSDN 定义的:
Default 属性检查类型 T 是否实现了 System.IEquatable(Of 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>
是您可以为您无法控制的类型实现它。)
您需要覆盖Equals(object obj)
. 总是希望您GetHashCode
在修改Equals
. 在 MSDN 上阅读这篇文章。