IEnumerable.Except()如何工作?

Ral*_*eus 3 c# linq ienumerable

我试图排除要添加到数据库中的实体(如果它们已经存在)。因此,我认为newBillInstances.Except(dbContext.BillInstances)这是最好的方法。但是,它完全不起作用(不排除任何实体),因为List<string>它可以完美地工作。

我读了这个讨论和实际能解密.Except()MSDN。它指出.Except()要实现的类应IEqualityComparer<T>使用默认比较器。

实际上,MSDN文章并未完全描述两个实例的比较过程。我仍然不明白为什么Equals()和GetHashObject()都必须被覆盖。

我已经实现了IEqualityComparer<BillInstance>接口,并在两种方法中都设置了断点,但是在调用.Except(IEnumerable)它时并未使用。只有当我更改为时,我才会.Except(IEnumerable, new BillInstanceComparer())咳嗽,GetHashCode()但咳嗽不会中断Equals()

然后,我IEqualityComparer<BillInstance>BillInstance类中实现了正确的方法,并期望在使用时可以使用它,.Except(IEnumerable)但是两种方法都不会造成中断。

所以我有两个问题:

  1. 应该做什么使用.Except(IEnumerable)
  2. 为什么Equals()根本不使用?是否仅在两个实例的哈希码相同的情况下使用?

xan*_*tos 5

因为Equals()仅当两个对象具有相同的时才使用GetHashCode()。如果没有相同的对象,GetHashCode()则没有机会使用Equals()

在内部Except()使用Set<>(您可以在此处看到),这是一个内部类,您应考虑与等效HashSet<>。此类使用对象的哈希值对它们进行“索引”,然后使用Equals()来检查具有相同哈希值的两个对象是否相同或不同,但具有相同的哈希值。

链接到其他相关答案:https : //stackoverflow.com/a/371348/613130