2009-12-02 110 views
1

我有一個類與字段ColDescriptionOne(字符串),ColDescriptionTwo(字符串)和ColCodelist(int)。我想獲得這個類的兩個列表的相交,其中desc相等但代碼列表不同。問題與自定義EqualityComparer

我可以使用Where子句並獲得我需要的。不過,我似乎無法使其工作使用自定義比較是這樣的:

internal class CodeListComparer: EqualityComparer<SheetRow> 
{ 
    public override bool Equals(SheetRow x, SheetRow y) 
    { 
     return Equals(x.ColDescriptionOne, y.ColDescriptionOne) && 
       Equals(x.ColDescriptionSecond, y.ColDescriptionOne) 
       && !Equals(x.ColCodelist, y.ColCodelist); 
    } 

    public override int GetHashCode(SheetRow obj) 
    { 
     return ((obj.ColDescriptionOne.GetHashCode()*397) + (obj.ColDescriptionSecond.GetHashCode()*397) 
       + obj.ColCodelist.GetHashCode());    
    } 
} 

,然後用它是這樣的:

VAR onylByCodeList = firstSheet.Entries.Intersect(otherSheet.Entries,新CodeListComparer ());

任何想法我在做什麼錯在這裏?

感謝 蘇尼特

回答

2

你有equals方法中一個錯字。第二行是將ColDescriptionOne與ColDescriptionSecond進行比較。它們都應該是ColDescriptionSecond。

return Equals(x.ColDescriptionOne, y.ColDescriptionOne) 
     && Equals(x.ColDescriptionSecond, y.ColDescriptionSecond) 
     && !Equals(x.ColCodelist, y.ColCodelist); 

您遇到的第二個問題是您在GetHashCode方法中包含ColCodeList。 GetHashCode方法必須爲相等的對象返回相同的值。在這種情況下,雖然ColCodeList在值相等時應該是不同的。這意味着,如果你想要2個對象被認爲是相等的,他們更可能有不同的哈希碼,這是不正確的。

取出GetHashCode方法,一切都應該工作。

public override int GetHashCode(SheetRow obj) 
{ 
    return ((obj.ColDescriptionOne.GetHashCode()*397) 
      + (obj.ColDescriptionSecond.GetHashCode()*397)); 
} 
+0

對不起......但那是愚蠢的我!我確實改變了,但仍然無法得到它。也許我錯過了其他的東西... – Sunit 2009-12-02 17:24:54

+0

謝謝...你是對的。我完全錯過了。 – Sunit 2009-12-02 18:36:17

+0

快速的問題,如果我需要從通過上述比較器的兩個對象報告值,我想我需要一個自定義擴展與GetEnumerators()...正確嗎? – Sunit 2009-12-02 19:45:22