自定义EqualityComparer的问题

时间:2009-12-02 17:17:55

标签: c# linq

我有一个包含字段ColDescriptionOne(字符串),ColDescriptionTwo(字符串)和ColCodelist(int)的类。我想得到这个类的两个列表的相交,其中desc相等但代码列表不同。

我可以使用Where子句并获得我需要的东西。但是,我似乎无法使用这样的自定义Comparer使其工作:

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,new CodeListComparer());

我在这里做错了什么想法?

感谢 苏尼特

1 个答案:

答案 0 :(得分: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));
}