C# 我的IEquatable仍在使用Object.GetHashcode作为字典<;T>;[]
我有下面这样的东西作为通用词典的索引C# 我的IEquatable仍在使用Object.GetHashcode作为字典<;T>;[],c#,c#-4.0,dictionary,generic-collections,iequatable,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 } } 类IMyCla
class IMyClass<T> : IEquatable<IMyClass> where T : struct
{
//etc
}
class MyClass<T> : IMyClass<T> where T : struct
{
public bool Equals(IRatingKey<T> other)
{
//etc
}
}
类IMyClass:IEquatable其中T:struct
{
//等
}
类MyClass:IMyClass,其中T:struct
{
公共布尔等于(IRatingKey其他)
{
//等
}
}
根据我对EqualityComparer.Default
的理解,应该可以看出我已经实现了IEquatable
,因此可以动态创建EqualityComparer
字典
需要一个相等实现来
确定关键点是否相等。如果比较器为null,则
构造函数使用默认的泛型相等比较器,
EqualityComparer.Default
。如果类型TKey
执行
System.IEquatable
通用接口,默认相等比较器
使用该实现
然而,从我对使用字典索引器dictionary[]
的了解来看,它仍然依赖于覆盖GetHashcode,例如public override int GetHashcode()
我可以看到,为了保持一致性,有一些建议可以覆盖lot,但我正在尝试更多地理解它。是不是因为IEquatable应该直接在MyClass上而不是在IMyClass中?但我更喜欢在IMyClass上使用它,所以实现者需要是字典密钥
我正在试用IEqualityComparer,但据我所知,我并不需要它。
字典
总是先检查GetHashCode
,然后再查看bucket的元素
假设字典
是长度为L的数组
,在添加新元素时,它会计算适当的索引,如
index=item.GetHashCode()%L
并将该元素放在适当的存储桶的末尾(只是一个模型,实际上它也需要Abs,必要时重新构建一个数组)
因此,在任何一点上,它都有以下结构
---
0 -> Item1, Item2
---
1 -> Item3
---
2
---
...
---
L-1-> Item7
在查找时,dictionary再次计算索引,并使用相等来仅检查计算索引的bucket元素。因此使用索引器肯定会使用
GetHashCode()
,这就是它生成原始哈希代码的方式。当它被添加时,用来决定放在哪个桶中的那个。嘿,有什么理由投票支持close或downvote吗?我想,如果有人不知道字典是如何工作的,那么这是一个很好的提问的地方……真的@MichaelPerrenoud,谢谢你的反馈。我注意到它需要GetHashCode(),需要它是有道理的。但是文档中不清楚,所以我想确定一下。谢谢Arsen,所以在文档中明确说明了字典的其他部分在“外部”是如何工作的。但在存储内部,它仍然需要GetHashCode()?我说不需要IEqualityComparer是对的吗?作为EqualityComparer.Default为我整理好了吗?是的,IEquatable是关键,我相信Dictionary.Default将用于动态创建IEqualityComparer(有点?)。是的,Alex,Dictionary总是调用key的GetHashCode来确定bucket,然后使用IEquatable在bucket元素之间循环。文档只是说了第二部分,我相信您也可以在文档的某个地方找到第一个元素:)非常感谢,很高兴看到我没有发疯。我希望有一个IDictionaryKey,它会使它更容易:-)