【问题标题】:Issue with custom EqualityComparer自定义 EqualityComparer 的问题
【发布时间】:2009-12-02 17:17:55
【问题描述】:

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

我可以使用 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, new CodeListComparer());

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

谢谢 苏尼特

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    您在 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));
    }
    

    【讨论】:

    • 对不起......但那是我的愚蠢!我确实改变了,但仍然无法得到它。也许我错过了其他东西......
    • 快速提问,如果我需要报告通过上述比较器的两个对象的值,我想我需要一个带有 GetEnumerators() 的自定义扩展...对吗?
    猜你喜欢
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    相关资源
    最近更新 更多