22

私のクラス:

public class myClass
{
    public int A { get; set; }
    public int B { get; set; }
    public int C { get; set; }
    public int D { get; set; }
}

および主な例:

Dictionary<myClass, List<string>> dict = new Dictionary<myClass, List<string>>();
myClass first = new myClass();
first.A = 2;
first.B = 3;

myClass second = new myClass();
second.A = 2;
second.B = 3;
second.C = 5;
second.D = 6;

dict.Add(first, new List<string>());

if (dict.ContainsKey(second))
{
    //
    //should come here and update List<string> for first (and only in this example) key 
    //
}
else
{
    //
    //if myFirst object has difference vlues of A or B properties
    //
    dict.Add(second, new List<string>());
}

これを行う方法?

4

3 に答える 3

11

デフォルトでは、比較により、ハッシュ コードに基づいてオブジェクトがバケットに入れられます。Equals2 つのハッシュ コードが同じ場合は、詳細な比較が ( を呼び出して) 実行されます。クラスが同等性を提供GetHashCodeも実装もしない場合は、デフォルトobject.GetHashCodeが使用されます。この場合、値比較のセマンティクスにクラス固有のものは使用されません。同じ参照のみが見つかります。これが望ましくない場合は、GetHashCode平等を実装して実装してください。

例えば:

public class myClass
{
    public int A { get; set; }
    public int B { get; set; }
    public int C { get; set; }
    public int D { get; set; }

    public bool Equals(myClass other)
    {
        if (ReferenceEquals(null, other)) return false;
        if (ReferenceEquals(this, other)) return true;
        return other.A == A && other.B == B && other.C == C && other.D == D;
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;
        if (obj.GetType() != typeof (myClass)) return false;
        return Equals((myClass) obj);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            int result = A;
            result = (result*397) ^ B;
            result = (result*397) ^ C;
            result = (result*397) ^ D;
            return result;
        }
    }
}
于 2012-07-19T14:39:11.167 に答える
4

myClass でオーバーライドします。

  • GetHashCode メソッド

  • Equals メソッド

GetHashCode メソッドを実装するには、整数プロパティから GetHashCodes を XOR するだけです。

必要に応じて ToString メソッドをオーバーライドし、IEquatable インターフェイスを実装します

于 2012-07-19T14:36:50.980 に答える