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