假设我有一个类T
,我想将其用作Dictionary<T,U>
集合中的键。
我必须在T
中实施哪些内容,以便这些密钥基于T
而不是T
引用的值?
我希望它只是GetHashCode()
。
答案 0 :(得分:5)
您必须实现GetHashCode()和Equals()。
字典是封面下的Hashtable,因此您可能需要阅读:Pitfalls Of Equals/GetHashCode – How Does A Hash Table Work?
答案 1 :(得分:3)
如果你没有在字典构造函数中传递任何IEqualityComparer<T>
,它将使用MSDN定义的EqualityComparer<T>.Default
:
Default属性检查是否 type T实现System.IEquatable(Of T) 接口,如果是,则返回一个 EqualityComparer(Of T)表示 使用该实现。除此以外, 它返回一个使用覆盖的EqualityComparer(Of T) 由T。
提供的Object.Equals和Object.GetHashCode
因此,实施IEquatable<T>
是我的选择(如果您实施它,那么无论如何都有意义覆盖Equals
和GetHashCode
。
答案 2 :(得分:3)
实施Equals
和GetHashCode
或创建一个合适的IEqualityComparer<T>
,它具有正确的地形相等匹配形式
我更喜欢IEqualityComparer<T>
路线:在很多情况下,没有一种明显正确的平等形式 - 你希望根据情况以不同的方式对待对象。在这种情况下,自定义相等比较器正是您所需要的。当然,如果 是一个自然的相等操作,那么在类型本身中实现IEquatable<T>
是有意义的......如果可以的话。 (IEqualityComparer<T>
的另一个好处是你可以为你无法控制的类型实现它。)
答案 3 :(得分:2)
您需要覆盖Equals(object obj)
。修改GetHashCode
时,始终需要实施Equals
。在MSDN上阅读此article。