使用IEqualityComparer和Linq Except 给了我重复列表的结果
本文关键字:列表 结果 IEqualityComparer Linq Except 使用 | 更新日期: 2023-09-27 18:33:07
我有两个列表需要比较,应该通过它们的外部 ID 排除重复项,但是我总是得到的结果是在两个列表中具有相同外部 ID 的记录列表。
法典:
public class FooComparer : IEqualityComparer<Foo>
{
public bool Equals(Foo x, Foo y)
{
if (ReferenceEquals(x, y)) return true;
if (ReferenceEquals(x, null) || ReferenceEquals(y, null))
return false;
return x.ExternalId == y.ExternalId;
}
public int GetHashCode(Foo foo)
{
if (ReferenceEquals(foo, null)) return 0;
return foo.ExternalId.GetHashCode();
}
}
var bulkFoos = _bulkFoo.GetBulkFoos();
var fooFromXmlList = Mapper.Map<List<Foo>>(bulkFoos);
var foosWithUniqueId = _fooRepository.GetAllWithExternalId();
var fooWithUniqueIdList = Mapper.Map<List<Foo>>(foosWithUniqueId);
var fooList = fooFromXmlList.Except(fooWithExternalIdList, new FooComparer());
您的GetHashCode
实现应使用与相等相同的属性,但是您的实现使用foo.Id
作为哈希代码,foo.externalId
用于相等。更改GetHashCode
以使用externalId
:
public int GetHashCode(Foo foo)
{
if(ReferenceEquals(foo, null)) return 0;
else return foo.externalId.GetHashCode();
}