我有一个包含字段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());
我在这里做错了什么想法?
感谢 苏尼特
答案 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));
}