C# 字典项的GetHashCode

C# 字典项的GetHashCode,c#,dictionary,gethashcode,C#,Dictionary,Gethashcode,我重写了我的一个类的Equals方法。在该方法中,我检查字典的每一对与另一个实例的字典的每一对的相等性,如下所示 public override bool Equals (object obj) { ... // compare to make sure all <key, value> pair of this.dict have // the match in obj.dict ... }

我重写了我的一个类的Equals方法。在该方法中,我检查字典的每一对与另一个实例的字典的每一对的相等性,如下所示

    public override bool Equals (object obj)
    {
        ...
        // compare to make sure all <key, value> pair of this.dict have
        // the match in obj.dict

        ...
    }
public override bool Equals(对象对象对象)
{
...
//比较以确保所有对this.dict
//在obj.dict中的匹配
...
}
现在,我需要重写GetHashCode方法以及建议的内容

我是否需要为字典的所有键或键加值执行此操作

基本上,以下是好的还是过火的

public override int GetHashCode ()
{
    int iHash = 0;

    foreach (KeyValuePair<string, T> pair in this.dict)
    {
        iHash ^= pair.Key.GetHashCode();
        iHash ^= pair.Value.GetHashCode();
    }

    return iHash;
}
public override int GetHashCode()
{
int-iHash=0;
foreach(此.dict中的KeyValuePair对)
{
iHash^=pair.Key.GetHashCode();
iHash^=pair.Value.GetHashCode();
}
返回iHash;
}

您计划在哈希集中使用该对象吗?如果对象的使用方式要求其哈希值唯一可识别,那么实际上只需要实现GetHashCode。在实现GetHashCode时,最好考虑equality中使用的相同字段,但并不总是必需的


如果您的情况需要,我相信您的想法是正确的。

根据@Mitch Wheat链接的内容,如果将该类与字典或哈希集一起使用,那么这不是执行GetHashCode()的最佳方法

假设您的内部词典只有一个条目。您的散列现在是单个
KeyValuePair
的值。将整个类粘贴在
哈希集中。将另一项添加到内部
词典中。现在,类的hashcode已经更改,因为您正在迭代类中的两个项

当您调用
HashSet.Contains(obj)
时,它会调用现在已更改的
obj.GetHashCode()
,即使它是同一个类实例
HashSet.Contains()
将发现它不包含此新哈希,并返回false,从不调用Equals(如果引用相同,则返回true)

突然之间,它就像你的对象从哈希集中消失了一样,即使类在其中,但是哈希已经过时了

你真的不想改变你的哈希。在
GetHashCode
中发生冲突是可以的,因为如果发生冲突,它将调用(较慢的)
.Equals()
方法。这是一个方便的优化,如果执行不当,可能会导致一些头痛的过程


作为旁注,正如上面链接中所指出的,最好将哈希值乘以
^
之前的素数,再乘以另一个值。有助于保持has的唯一性。

您试图为什么生成hashcode?这是您创建的自定义类吗?或者您正在将某个内容的IEqualityComparer传递到现有词典中?是的,这是在我创建的自定义类中。酷。这就是我想知道的。这纯粹是为了与众不同。很高兴我能帮上忙。如果这是您满意的答案,如果您将此标记为答案,我们将不胜感激。:)这是一个合理的担忧。如果字典是不可变的呢?如果键/值对从未更改,我的意思是,无论是添加还是删除no
KeyValuePairs
键对,还是每个
KeyValuePairs
键对的实际键和值都没有更改,那么是的,您就不必担心了。请记住,在每个
KeyValuePair
中,键或值可以是一个类,并且该类可以是可变的,如果它被更改,则输出不同的HashCode