C# 字典项的GetHashCode
我重写了我的一个类的Equals方法。在该方法中,我检查字典的每一对与另一个实例的字典的每一对的相等性,如下所示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 ... }
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传递到现有词典中?是的,这是在我创建的自定义类中。酷。这就是我想知道的。这纯粹是为了与众不同。很高兴我能帮上忙。如果这是您满意的答案,如果您将此标记为答案,我们将不胜感激。:)这是一个合理的担忧。如果字典是不可变的呢?如果键/值对从未更改,我的意思是,无论是添加还是删除noKeyValuePairs
键对,还是每个KeyValuePairs
键对的实际键和值都没有更改,那么是的,您就不必担心了。请记住,在每个KeyValuePair
中,键或值可以是一个类,并且该类可以是可变的,如果它被更改,则输出不同的HashCode