假设我有两个具有不同数量属性的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; }
}
为了在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类来支持这个?如果没有,有什么理由吗?
或者我们必须自己管理?
答案 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();
}
}