使用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());

使用IEqualityComparer和Linq Except 给了我重复列表的结果

您的GetHashCode实现应使用与相等相同的属性,但是您的实现使用foo.Id作为哈希代码,foo.externalId用于相等。更改GetHashCode以使用externalId

public int GetHashCode(Foo foo)
{
    if(ReferenceEquals(foo, null)) return 0;
    else return foo.externalId.GetHashCode();
}