Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我的IEquatable仍在使用Object.GetHashcode作为字典<;T>;[]_C#_C# 4.0_Dictionary_Generic Collections_Iequatable - Fatal编程技术网

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,它会使它更容易:-)