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