我有类似下面的东西作为通用字典的关键.
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>
requires an equality implementation to
determine whether keys are equal. If comparer is null, this
constructor uses the default generic equality comparer,
EqualityComparer<T>.Default
. If typeTKey
implements the
System.IEquatable<T>
generic interface, the default equality comparer
uses that implementation.
然而,从我所看到的使用字典索引器字典< T> [],它仍然依赖于重写GetHashcode,例如公共覆盖int GetHashCode()
我可以看到有建议覆盖该批次的一致性,但我试图更多地理解它.是因为IEquatable应该直接在MyClass上而不是在IMyClass中吗?但我更喜欢它在IMyClass上,所以实现者需要成为字典键.
我正在尝试IEqualityComparer,但据我所知,我不需要它.
最佳答案 Dictionary总是首先检查GetHashCode,然后继续查看存储桶的元素
假设Dictionary为长度为L的数组,在新元素添加时,它会计算出适当的索引
index = item.GetHashCode()%L
并将该元素放在适当的桶的末尾(只是一个模型,实际上它也需要Abs,并在必要时重新构建一个数组)
所以在任何一点上它都有以下结构
---
0 -> Item1, Item2
---
1 -> Item3
---
2
---
...
---
L-1-> Item7
在查找时,字典再次计算索引,并使用Equality仅检查计算索引的存储区元素.