0

カスタムタイプを2つ比較して、 /メソッドList<T>を使用しようとしています。同等性は、このタイプの3つのフィールドによって決定されます。同等性は、通常の条件よりも多くに基づいています(すべてのフィールドに同じデータが含まれています)。もちろん実装しました。私の問題は、hashCodeが同じでない場合、メソッドが等しくないことを返します。これは私の場合は当てはまらないため、これは役に立ちません。IntersectExceptIEqualityComparer<T>GetHashCode()

等式が複数の条件に基づいている場合に2つのカスタムオブジェクトを比較して、intersect / exception / distinctなどを使用できるようにする方法はありますか?

これが私のコードです:

public bool Equals(ComparableObject x, ComparableObject y)
{
    if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
        return false;

    if (Object.ReferenceEquals(x, y))
        return true;

    if (x.Var1.Equals(y.Var1) && x.Var3.Equals(y.Var3) && !x.Var2.Equals(y.Var2))
        return false;

    if (x.Var1.Equals(y.Var1) && !x.Var3.Equals(y.Var3) && !x.Var2.Equals(y.Var2))
        return true;


    if (!x.Var1.Equals(y.Var1) && x.Var3.Equals(y.Var3) && !x.Var2.Equals(y.Var2))
        return false;

    if (!x.Var1.Equals(y.Var1) && x.Var3.Equals(y.Var3) && x.Var2.Equals(y.Var2))
        return true;

    if (x.Var1.Equals(y.Var1) && !x.Var3.Equals(y.Var3) && x.Var2.Equals(y.Var2))
        return false;

    if (!x.Var1.Equals(y.Var1) && !x.Var3.Equals(y.Var3) && x.Var2.Equals(y.Var2))
        return false;

    if (!x.Var1.Equals(y.Var1) && !x.Var3.Equals(y.Var3) && !x.Var2.Equals(y.Var2))
        return false;


    return x.Var1.Equals(y.Var1) && x.Var1.Equals(y.Var1) && x.Var3.Equals(y.Var3);
}


public int GetHashCode(ComparableObject x)
{
    return obj.Var1.GetHashCode() ^ obj.Var2.GetHashCode()^ obj.Var3.GetHashCode()
}
4

2 に答える 2

2

GetHashCode()返される値が異なるオブジェクトに対して異なるように(可能な限り多くの場合、等しくないオブジェクトに対して同じハッシュコードを返す可能性があります)、常に同じになるように提供するのはあなたの仕事です。等しい場合があります(すべての場合。等しいオブジェクトに対して異なるハッシュコードを返すことはできません)。

たとえば、比較する3つのフィールドの1つがである場合、intそのフィールドをとして返すことができますGetHashCode()

ただし、賢いものを思い付くのが難しい場合は、などの定数を返すことができます42。この方法Equals()は、パフォーマンスが最も低い方法ではありますが、すべてのオブジェクトペアに対して呼び出され、期待される結果を提供します。

于 2012-03-09T12:20:28.243 に答える
0

基になる型のGetHashCodeに他の問題があるかどうかはわかりませんが、これはカスタム型の例であり、最初の2つのフィールドのみが同じである場合にtrueを返すIEqualityComparerです。これにより、Exceptなどがそのタイプで機能できるようになります。

    public class CustomType
    {
        public int Val1 { get; set; }
        public int Val2 { get; set; }
        public int Val3 { get; set; }
    }

    class CustomTypeComparer : IEqualityComparer<CustomType>
    {
        public bool Equals(CustomType x, CustomType y)
        { return x.Val1 == y.Val1 && x.Val2 == y.Val2; }

        public int GetHashCode(CustomType obj)
        { return obj.Val1.GetHashCode() ^ obj.Val2.GetHashCode(); }
    }

プロパティがのような単純なタイプでない場合は、オブジェクトを比較する代わりにintを使用することをお勧めします。Equals()==

于 2012-03-09T12:28:32.657 に答える