我有类似以下的东西作为通用词典的关键。
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>
需要实现相等的实现 确定键是否相等。如果comparer为null,则为此 构造函数使用默认的通用相等比较器,EqualityComparer<T>.Default
。如果类型TKey
实现了System.IEquatable<T>
通用接口,默认的相等比较器 使用该实现。
但是,根据我对使用字典索引器Dictionary<T>[]
的看法,它仍然依赖于重写GetHashcode,例如public override int GetHashCode()
我可以看到有建议覆盖批次以保持一致性,但我试图更多地了解它。是因为IEquatable应该直接在MyClass上而不是在IMyClass中吗?但我更喜欢它在IMyClass上,所以实现者需要成为字典键。
我正在试验IEqualityComparer,但据我所知,我并不需要它。
答案 0 :(得分:2)
Dictionary
总是首先检查GetHashCode
,然后继续查看存储桶的元素
假设Dictionary
为Array
长度为L,在新元素添加时计算适当的索引,如
index = item.GetHashCode() % L
并将该元素放在适当的桶的末尾(只是一个模型,实际上它也需要Abs,并在必要时重新构建一个数组)
所以在任何一点上它都有以下结构
---
0 -> Item1, Item2
---
1 -> Item3
---
2
---
...
---
L-1-> Item7
在查找时,字典再次计算索引,并使用Equality仅检查计算索引的存储区元素。