簡體   English   中英

尋找類似StructuralEqualityComparer的內置類 <T> 與通用版本

[英]Look for built-in class like StructuralEqualityComparer<T> with generic version

假設我有兩個具有不同數量屬性的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框架有一個內置類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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM