我的 IEquatable 仍在使用 Object.GetHashcode for Dictionary<T>[]



我有以下内容作为通用字典的关键字。

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>需要一个相等的实现来确定键是否相等。如果比较器为null,则构造函数使用默认的通用相等比较器,EqualityComparer<T>.Default。如果类型TKey实现System.IEquatable<T>通用接口,默认相等比较器使用该实现。

然而,从我使用字典索引器Dictionary<T>[]的情况来看,它仍然依赖于重写GetHashcode,例如public override int GetHashCode()

我可以看到,为了保持一致性,有人建议覆盖批次,但我正在努力理解它。是因为IEquatable应该直接在MyClass上而不是在IMyClass中吗?但我更喜欢在IMyClass上使用它,所以实现者需要是字典键。

我正在试用IEqualityComparer,但据我所知,我不需要它。

Dictionary总是先检查GetHashCode,然后再查看bucket 的元素

假设Dictionary是长度为L的Array,在添加新元素时,它会计算出适当的索引,如

index = item.GetHashCode() % L

并将该元素放在适当的bucket的末尾(只是一个模型,实际上它还需要Abs,必要时重新构建一个数组)

因此,在任何一点上,它都有以下结构

---
0  -> Item1, Item2
---
1  -> Item3
---
2 
---
...
---
L-1-> Item7

在查找时,dictionary会再次计算索引,并使用Equality只检查已计算索引的bucket元素。

最新更新