3

2 つのクラスがAありB、プロパティの数が異なるとします。

class A
{
    public int Pro1  { get; set; }
    public string Pro2 { get; set; }   
}

class B
{
    public int Pro1 { get; set; }
    public string Pro2 { get; set; }
    public bool Pro3 { get; set; }
}

Distinct、Intesect などのラムダ メソッドで使用する構造的等値比較を行うには、次の 2 つのカスタムを作成する必要がありEqualityComparerます。

public class CustomComparerA : EqualityComparer<A> {} 
// use all Pro1 and Pro2

public class CustomComparerB : EqualityComparer<B> {} 
// use all Pro1, Pro2 and Pro3

10 個のエンティティがある場合、10 個のカスタム比較子を作成する必要があります。コードがあまりきれいではないようです。調べてみると、.NET フレームワークには組み込みクラスStructuralEqualityComparerがありますが、 としてマークされており、ジェネリック バージョンinternalがありません。私が見ているのは:

StructuralEqualityComparer<T>

私が再利用できるように:

listA.Distinct(new Structuralequalitycomparer<A>())
listA.Distinct(new Structuralequalitycomparer<B>())

これをサポートする組み込みクラス .NET を知っている人はいますか? そうでない場合、何か理由はありますか?

それとも自分たちで管理しなければなりませんか?

4

1 に答える 1

1

StructuralEqualityComparer<T>dasblinkenlight の回答に記載されている理由により、.NET はこれをサポートしていないため、自分でビルドすることができました。dasblinkenlight に感謝します。

private class StructuralEqualityComparer<T> : EqualityComparer<T> where T : class
{
    public override bool Equals(T x, T y)
    {
        return typeof(T).GetProperties()
                         .All(pro => pro.GetValue(x).Equals(pro.GetValue(y)));

    }

    public override int GetHashCode(T obj)
    {
        int hashCode = typeof(T).GetProperties()
                                .Aggregate(0, (current, pro) => 
                                     current ^ pro.GetValue(obj).GetHashCode());

        return hashCode.GetHashCode();
    }
}
于 2012-09-27T11:10:52.387 に答える