0

EqualsおよびGetHashCodeメソッドをオーバーライドする必要があるクラスPersonがあります。名前が一致する場合、または電子メールが一致する場合、2人のオブジェクトは等しくなります。かなり効率的なハッシュ関数でこれを行う良い方法は何ですか?

class Person
{
    string Name
    string Email

    public override Equals(object obj)
    {
        if (ReferenceEquals(obj, null))
            return false;
        if (ReferenceEquals(this, obj))
            return true;
        if (obj is Person)
        {
            Person person = (Person)obj;
            return
                (this.Name == person.Name)
                || (this.Email == person.Email);
        }
        return false;
    }

    public override GetHashCode()
    {
        // What's a good way to implement?
    }
}
4

4 に答える 4

10

あなたは本当にできません。まあ、定数値を返すことは別として。

このように見てみましょう...メール「x」を持つすべての人は、等しいので、同じハッシュ コードを持っている必要があります。そして、「y」という名前を持つすべての人は、同じハッシュ コードを持っている必要があるため、次のように続きます。

Name    Email    Hash
  n1       e1      h1
  n2       e1      h1 (because emails are equal
  n2       e2      h1 (because names are equal to previous)

名前と電子メールの両方を任意の値に変更する方法に注意してください。ただし、ハッシュは h1 のままにする必要があります。

于 2010-11-08T22:14:19.540 に答える
8

これがあなたの質問に答えないことは知っていますが、あなたのアプローチは正しくありません。a == b かつ b == c の場合、必然的に a == c となることが予想されます。

Person a:
    name: mike
    email: someone@website.com

Person b:
    name: steve
    email: someone@website.com

Person c:
    name: steve
    email: steve@website.com

この例では、a == b および b == c ですが、a != c です。これは正しくない動作です。この動作を実装したい場合は、この比較を行う Equals 以外のメソッドを用意しても問題ありませんが、equals は行いません。

http://msdn.microsoft.com/en-us/library/ms173147%28VS.80%29.aspxを参照してください。

于 2010-11-08T22:20:29.693 に答える
0

アレックスが言ったように、これはビジネス ルールに関連するものであり、私はこの目的で Equals を使用しません。Equals メソッドに実装されている別のメソッドが必要です。

もちろん、Alex は Name+email のハッシュについて言及していますが、Jon が指摘したように、それはあなたにとってもうまくいきません。ビジネス ルールを考えると、実際にはできることではありません。

于 2010-11-08T22:23:36.900 に答える
-4

やろうとしていることを実行できる方法があります。

そのように定義した列挙型があるとしましょう

public enum MatchedOn { None, Name, Email }

次に、Equals メソッドから呼び出すように、Equals メソッドの実装を別のメソッドに引き出します。この新しいメソッドでは、名前が等しい場合は列挙型を Name に設定し、電子メールが等しい場合は Email に設定し、どちらも同じでない場合は None に設定します。

次に、GetHashCode 実装で、この新しいメソッドも呼び出して、名前または電子メール、またはその両方の組み合わせに基づいてハッシュ コードを返すことができます。

それが理にかなっていることを願っています。

于 2010-11-09T07:24:25.810 に答える