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

时间:2016-02-04 10:24:39

标签: c# linq

我有两个需要比较的列表,应该通过外部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());

1 个答案:

答案 0 :(得分:1)

您的foo.Id实现应使用与相等属性相同的属性,但是您的使用foo.externalId表示哈希码,GetHashCode表示相等。将externalId更改为使用public int GetHashCode(Foo foo) { if(ReferenceEquals(foo, null)) return 0; else return foo.externalId.GetHashCode(); }

{{1}}