2009-12-02 66 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