繁体   English   中英

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

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

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

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

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

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

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

index = item.GetHashCode() % L

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM