为什么两个对象的哈希码不一样,尽管它们有相似的值。另一个最好的方法是找到对象之间的值相等,而不是读取每个属性的值,并检查其他属性?
Person person = new Person();
person.Name = "X";
person.Age = 25;
person.Zip = 600056;
person.Sex = 'M';
Person person1 = new Person();
person1.Name = "X";
person1.Age = 25;
person1.Zip = 600056;
person1.Sex = 'M';
int hashCode1 = person1.Name.GetHashCode();
int hashCode = person.Name.GetHashCode();
// hashCode1 and hashCode values are same.
if (person.GetHashCode() == person1.GetHashCode())
{
// Condition is not satisfied
}发布于 2012-06-16 13:44:51
在您的代码中,hashCode1 == hashCode是正确的,因为散列相同的字符串总是会得到相同的结果。然而,本质是不同的,因此您必须以适合您的业务逻辑的方式覆盖GetHashCode(),例如
public override int GetHashCode()
{
return Name.GetHashCode() ^ Zip.GetHashCode() ^ Sex ^ Age;
}我建议你看看这个答案,GetHashCode Guidelines in C#。
和http://musingmarc.blogspot.com/2007/08/vtos-rtos-and-gethashcode-oh-my.html
发布于 2012-06-16 13:16:11
在您的示例中,这两个对象是相似的,但又不相同。它们是不同的实例,因此它们具有不同的哈希码。此外,person1 == person2和person1.Equals(person2)也是假的。
您可以覆盖此行为。如果您认为这两个对象相同(如果这些属性相等),则可以:
public override bool Equals(object other) {
if(other == this) return true;
var person = other as Person;
if(person == null) return false;
return person.Name == Name && person.Age == Age && person.Zip == Zip && person.Sex == Sex;}
public override int GetHashCode() {
//some logic to create the Hash Code based on the properties. i.e.
return (Name + Age + Zip + Sex).GetHashCode(); // this is just a bad example!
}发布于 2012-06-16 13:09:42
为什么两个对象的散列代码不相同,尽管它们具有相似的值
因为这是唯一识别它们的预期方式。AFAIK,大多数框架/库默认使用指针值。
,另一种最好的方法是找到对象之间的值相等,而不是读取每个属性,并检查其他属性?
这取决于是什么让他们“平等”,根据你的需要。基本上,它仍然是比较属性,但可能只是更有限。
https://stackoverflow.com/questions/11060981
复制相似问题