【发布时间】:2014-02-14 15:20:21
【问题描述】:
我有类似以下内容作为通用字典的键。
class IMyClass<T> : IEquatable<IMyClass> where T : struct
{
//etc
}
class MyClass<T> : IMyClass<T> where T : struct
{
public bool Equals(IRatingKey<T> other)
{
//etc
}
}
根据我对EqualityComparer<T>.Default 的了解,应该可以看出我已经实现了IEquatable<T>,因此动态创建了一个EqualityComparer。
Dictionary<TKey, TValue>需要一个相等的实现来 判断键是否相等。如果比较器为空,则此 构造函数使用默认的泛型相等比较器,EqualityComparer<T>.Default。如果类型TKey实现System.IEquatable<T>泛型接口,默认相等比较器 使用该实现。
但是从我看到的使用字典索引器Dictionary<T>[] 来看,它仍然依赖于覆盖 GetHashcode,例如 public override int GetHashCode()
我可以看到有建议覆盖 很多 以保持一致性,但我正在尝试更多地理解它。是因为 IEquatable 应该直接位于 MyClass 而不是 IMyClass 中吗?但我更喜欢在 IMyClass 上使用它,因此实现者需要成为字典键。
我正在尝试使用 IEqualityComparer,但据我了解,我不需要它。
【问题讨论】:
-
所以使用索引器肯定会使用
GetHashCode(),这就是它生成原始哈希码的方式。用于确定添加时将其放置在哪个桶中的那个. -
嘿,有什么理由投票赞成或反对?我认为如果有人不确定字典是如何工作的,那么 SO 是一个很好的地方问...
-
True @MichaelPerrenoud,感谢您的反馈。我观察到它需要 GetHashCode() 并且需要它是有意义的。但是文档中并不清楚,所以我想确定一下。
标签: c# c#-4.0 dictionary generic-collections iequatable