使用引用类型的值作为字典键必须做什么?

时间:2010-05-21 11:49:22

标签: c# generics dictionary gethashcode

假设我有一个类T,我想将其用作Dictionary<T,U>集合中的键。

我必须在T中实施哪些内容,以便这些密钥基于T而不是T引用的值?

我希望它只是GetHashCode()

4 个答案:

答案 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>是我的选择(如果您实施它,那么无论如何都有意义覆盖EqualsGetHashCode

答案 2 :(得分:3)

实施EqualsGetHashCode 创建一个合适的IEqualityComparer<T>,它具有正确的地形相等匹配形式

我更喜欢IEqualityComparer<T>路线:在很多情况下,没有一种明显正确的平等形式 - 你希望根据情况以不同的方式对待对象。在这种情况下,自定义相等比较器正是您所需要的。当然,如果 是一个自然的相等操作,那么在类型本身中实现IEquatable<T>是有意义的......如果可以的话。 (IEqualityComparer<T>的另一个好处是你可以为你无法控制的类型实现它。)

答案 3 :(得分:2)

您需要覆盖Equals(object obj)。修改GetHashCode时,始终需要实施Equals。在MSDN上阅读此article