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

时间:2014-02-14 15:20:22

标签: c# c#-4.0 dictionary generic-collections iequatable

我有类似以下的东西作为通用词典的关键。

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,但据我所知,我并不需要它。

1 个答案:

答案 0 :(得分:2)

Dictionary总是首先检查GetHashCode,然后继续查看存储桶的元素

假设DictionaryArray长度为L,在新元素添加时计算适当的索引,如

index = item.GetHashCode() % L

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

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

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

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