查找内置类,例如StructuralEqualityComparer <t>和泛型版</t>

时间:2012-09-27 10:13:13

标签: c# linq

假设我有两个具有不同数量属性的AB个类:

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 ...我必须构建两个自定义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类来支持这个?如果没有,有什么理由吗?

或者我们必须自己管理?

1 个答案:

答案 0 :(得分:1)

我已经设法由StructuralEqualityComparer<T>自己构建,因为.NET不支持这一点,因为在dasblinkenlight的回答中提到的原因,感谢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();
    }
}