[英]Look for built-in class like StructuralEqualityComparer<T> with generic version
假設我有兩個具有不同數量屬性的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類來支持這個? 如果沒有,有什么理由嗎?
或者我們必須自己管理?
我已經設法由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();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.