我需要用我写的密钥类型为Dictionary
由默认构造函数创建的`Dictionary`是否使用哈希码?
I类阅读documentation on MSDN about the default constructor of Dictionary
Dictionary<TKey, TValue>
需要一个平等的实现来 确定键是否相等。此构造函数使用默认的 通用相等比较器,EqualityComparer<T>.Default
。如果类型TKey
实现了System.IEquatable<T>
通用接口,那么 默认的相等比较器将使用该实现。或者,您可以通过使用接受比较器参数的构造函数来指定IEqualityComparer<T>
一般 接口的实现。
这使得认为我必须做的唯一的事情就是我的关键类实现System.IEquatable<T>
但是我很惊讶,System.IEquatable<T>
没有一个HashCode()
方法。
那么以这种方式创建的字典会使用哈希码吗?如果是,它从哪里来?否则,我的字典是否有恒定的成本访问操作(我不认为没有哈希码就可以实现)
我相信c#字典实际上使用散列法 –
也读取第二个链接的“备注”部分,IEquatable接口。它说:_If如果你实现'IEquatable',你还应该重载'Object.Equals(Object)'和'GetHashCode'的基类实现,以便它们的行为与'IEquatable .Equals'方法的行为一致。如果你重写了'Object.Equals(Object)',那么你的类的静态'Equals(System.Object,System.Object)'方法的调用也会调用你重写的实现。这确保了所有'Equals'方法的调用返回一致的结果._ –
是的,我注意到在看到Babak Naffas的回答后第二次阅读。其实我刚接触'.Net',看到'IEquatable'中的Equals'方法,'IEqualityComparer'中的'Equals + GetHashCode'使我认为'Equals'和'GetHashCode'不在'Object'中在'.Net'中的类(没有检查,我的不好)。我没有想到luksan的答案强调的性能问题的微妙之处,它证明了一个具有泛型参数的替代方法,因此是一个实现的通用接口。 –