0

为什么两个对象的哈希码不相同,即使它们具有相似的值。在不读取每个属性并检查其他属性的情况下找到对象之间值相等的另一种最佳方法是什么?

                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
                }
4

3 回答 3

3

在你的代码中 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-16T05:44:50.827 回答
2

在您的示例中,两个对象相似但不相同。它们是不同的实例,因此它们具有不同的哈希码。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-16T05:16:11.487 回答
1

为什么两个对象的哈希码不相同,即使它们具有相似的值

因为这是唯一识别它们的预期方式。AFAIK,大多数框架/库默认使用指针值。

在不读取每个属性并检查其他属性的情况下找到对象之间值相等的另一种最佳方法是什么?

根据您的需要,取决于使它们“相等”的原因。基本上它仍在比较属性,但可能更有限。

于 2012-06-16T05:09:41.710 回答