Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义EqualityComparer的问题_C#_Linq - Fatal编程技术网

C# 自定义EqualityComparer的问题

C# 自定义EqualityComparer的问题,c#,linq,C#,Linq,我有一个类,它的字段有ColDescriptionOne(string)、ColDescriptionTwo(string)和ColCodelist(int)。我想得到这个类的两个列表的交集,其中desc是相等的,但是codelist是不同的 我可以使用Where子句来获得我需要的东西。但是,我似乎无法使用如下自定义比较器使其正常工作: internal class CodeListComparer: EqualityComparer<SheetRow> { public o

我有一个类,它的字段有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());            
    }
}
内部类CodeListComparer:EqualityComparer
{
公共覆盖布尔等于(图纸行x、图纸行y)
{
返回等于(x.ColDescriptionOne,y.ColDescriptionOne)&&
等于(x.ColDescriptionSecond,y.ColDescriptionOne)
&&!等于(x.ColCodelist,y.ColCodelist);
}
公共覆盖int GetHashCode(SheetRow obj)
{
返回((obj.ColDescriptionOne.GetHashCode()*397)+(obj.ColDescriptionSecond.GetHashCode()*397)
+obj.ColCodelist.GetHashCode());
}
}
然后像这样使用它:

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())

知道我做错了什么吗

谢谢
Sunit

您在Equals方法中有一个输入错误。第二行是比较ColDescriptionOne和ColDescriptionSecond。它们都应该是冷的

return Equals(x.ColDescriptionOne, y.ColDescriptionOne) 
       && Equals(x.ColDescriptionSecond, y.ColDescriptionSecond)
       && !Equals(x.ColCodelist, y.ColCodelist);
第二个问题是在GetHashCode方法中包含ColCodeList。GetHashCode方法必须为相等的对象返回相同的值。在这种情况下,当值相等时,ColCodeList应该是不同的。这意味着,如果希望将两个对象视为相等,则它们更有可能具有不同的哈希代码,这是不正确的

从GetHashCode方法中去掉这一点,一切都会正常工作

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

对不起…但我真是太蠢了!我确实变了,但还是没变。也许我遗漏了一些其他的东西…快速提问,如果我需要报告通过上述比较器的两个对象的值,我想我需要一个带有GetEnumerators()的自定义扩展…对吗?