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

Ale*_*ith 5 c# dictionary iequatable generic-collections c#-4.0

我有以下类似内容,是通用词典的关键。

class IMyClass<T> : IEquatable<IMyClass> where T : struct
{
  //etc
}


class MyClass<T> : IMyClass<T> where T : struct
{
    public bool Equals(IRatingKey<T> other)
    {
       //etc
    }
}
Run Code Online (Sandbox Code Playgroud)

据我了解EqualityComparer<T>.Default,应该看到我已经实现IEquatable<T>并因此动态创建了一个EqualityComparer。

Dictionary<TKey, TValue>需要一个相等的实现来确定键是否相等。如果comparer为null,则此构造方法使用默认的泛型相等比较器 EqualityComparer<T>.Default。如果type TKey实现了 System.IEquatable<T>通用接口,则默认的相等比较器将使用该实现。

但是从我使用字典索引器的角度来看Dictionary<T>[],它仍然依赖于覆盖GetHashcode例如public override int GetHashCode()

我可以看到有一些建议可以覆盖很多内容,以保持一致性,但是我想进一步理解它。是因为IEquatable应该直接在MyClass而不是IMyClass上吗?但我希望在IMyClass上使用它,因此实现者需要是字典键。

我正在尝试IEqualityComparer,但据我了解,我不需要它。

Ars*_*yan 2

Dictionary总是先检查GetHashCode,然后再继续查看桶中的元素

假设长度DictionaryArrayL,在添加新元素时,它会计算适当的索引,例如

index = item.GetHashCode() % L

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

所以在任何一点它都有以下结构

---
 0  -> Item1, Item2
---
 1  -> Item3
---
 2 
---
...
---
L-1-> Item7
Run Code Online (Sandbox Code Playgroud)

在查找时,字典再次计算索引,并使用 Equality 仅检查计算索引的桶元素。