3

假设我有两个类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; }
}

为了进行结构相等比较以在 Lamda 方法中使用,例如: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 来支持这个?如果没有,有什么原因吗?

还是我们必须自己管理?

4

1 回答 1

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();
    }
}
于 2012-09-27T11:10:52.387 回答