2014-06-09 35 views
0

我有很多List比較,使用sequenceEqual檢查:相等比較器使用通用

this.Details.SequenceEqual<EventDetail>(event.Details, new DetailsEqualityComparer()); 

既然這樣,我有很多的樣板,寫萬噸級很相似(除了爲類型參數EqualsgetHashCode)命名aClassEqualityCompareranotherClassEqualityComparer等等...

在這一點上,我已經在鑫卡特這種方式使用泛型重寫我的比較器:

class GenericEqualityComparer<T> : IEqualityComparer<T> where T : class 
{ 
    public bool Equals(T x, T y) 
    { 
     if (Object.ReferenceEquals(x, y)) return true; 

     if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) 
      return false; 

     return x.Equals(y); // here comes the problems 
    } 

    public int GetHashCode(T obj) 
    { 
     // some hashing calculation 
    } 
} 

問題是:據我所知在Equals方法,因爲使用的等於是Object.Equals,我總是得到false

錯誤在哪裏?

+0

你期望這個從默認的相等比較有什麼不同? –

回答

4

嗯,你可能做:

return EqualityComparer<T>.Default.Equals(x, y); 

return EqualityComparer<T>.Default.GetHashCode(x); 

但除非Equals即會仍然使用引用相等被覆蓋了T和/或T實現IEquatable<T>(其可能是你想要的,但從你的問題來看並不完全清楚)。

實際上,該實現基本上會複製EqualityComparer<T>.Default,因此您的自定義類的使用是多餘的 - 您可以直接使用EqualityComparer<T>.Default而不包裝它。

+1

如果他已經重寫了基類型中的這些方法,他不需要創建一個使用「EqualityComparer .Default」的新的'EqualityComparer',他只需要使用'EqualityComparer .Default'沒有包裝器。 – Servy

+0

@Servy同意 - 這就是我的意思是在最後的時間。不過,我認爲你更清楚地解釋了它。 –

1

您似乎重新實現了默認的相等比較器,該比較器調用實例的EqualsGetHashCode,當該類未實現時,實際上會回落到Object的實現。

可能要比較器/散列碼方法傳遞到您的比較器:

class GenericEqualityComparer<T> : IEqualityComparer<T> where T : class 
{ 
    Func<T,T,bool> myCompare; 
    public GenericEqualityComparer<T>(
     Func<T,T,bool> myCompare, Func<T,int> myGetHashCode) 
    { 
     this.myCompare= myCompare;     
     ... 
    } 

    public bool Equals(T x, T y) 
    { 
    .... 
    return myCompare(T,T); 
    }