5

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

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. 如果 typeTKey实现了 System.IEquatable<T>泛型接口,则默认相等比较器使用该实现。

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

我可以看到有建议覆盖很多以保持一致性,但我试图更多地理解它。是因为 IEquatable 应该直接位于 MyClass 而不是 IMyClass 中吗?但我更喜欢在 IMyClass 上使用它,因此实现者需要成为字典键。

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

4

1 回答 1

2

Dictionary总是GetHashCode先检查,然后再去查看存储桶的元素

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

index = item.GetHashCode() % L

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

所以在任何时候它都有以下结构

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

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

于 2014-02-14T15:24:25.113 回答