c# - 寻找具有通用版本的内置类,如 StructuralEqualityComparer<T>

标签 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; }
}

为了在 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 Framework 有一个内置类 StructuralEqualityComparer 但它标记为 internal,并且没有通用版本。我看到的是:

StructuralEqualityComparer<T>

这样我就可以重复使用:

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

有人知道内置类 .NET 支持这个吗?如果不是,有什么原因吗?

还是我们必须自己管理?

最佳答案

我已经通过 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();
    }
}

关于c# - 寻找具有通用版本的内置类,如 StructuralEqualityComparer<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12619007/

相关文章:

c# - 如何在 LINQ 中循环集合并传递数据

c# - 如何更改列表框选择背景颜色?

C# 和 PostgreSQL INSERT INTO

c# - 如何在 C# 中使用 FTP 列出目录内容?

c# - linq在groupby之后排序分组元素

c# - OrderBy [ Descending ]() 和 SkipWhile() 的意外行为

c# - LINQ - 拆分具有最大长度的字符串,但不将单词分开

C# .NET 和直接对象集合

c# - 在 C# 中引用另一个字符串

c# - 使用 XDocument 遍历节点的所有属性