0

2つのオブジェクトのハッシュコードが同じ値であるのに同じではないのはなぜですか。各プロパティを読み取らずにオブジェクト間の値の同等性を見つけ、他のプロパティをチェックするための他の最良のアプローチは何ですか?

                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はtrueです。これは、同じ文字列をハッシュすると常に同じ結果が得られるためです。ただし、インスタンスは異なるため、たとえばビジネスロジックに適合する方法でGetHashCode()をオーバーライドする必要があります。

    public override int GetHashCode()
    {
        return Name.GetHashCode() ^ Zip.GetHashCode() ^ Sex ^ Age;
    }

この回答をC#のGetHashCodeガイドラインで確認してください。

および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)はfalseです。

この動作をオーバーライドできます。これらのプロパティが等しい場合に2つのオブジェクトが同じであると考えると、次のことができます。

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

2つのオブジェクトのハッシュコードが同じ値であるのに同じではない理由

それがそれらを一意に識別するための期待される方法だからです。AFAIK、ほとんどのフレームワーク/ライブラリは、デフォルトでこれにポインタ値を使用します。

各プロパティを読み取らずにオブジェクト間の値の同等性を見つけ、他のプロパティをチェックするための他の最良のアプローチは何ですか?

あなたのニーズに応じて、それらを「等しく」するものに依存します。基本的にはまだプロパティを比較していますが、もっと制限されているかもしれません。

于 2012-06-16T05:09:41.710 に答える