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)但是两种方法都不会造成中断。
所以我有两个问题:
.Except(IEnumerable)?Equals()根本不使用?是否仅在两个实例的哈希码相同的情况下使用?因为Equals()仅当两个对象具有相同的时才使用GetHashCode()。如果没有相同的对象,GetHashCode()则没有机会使用Equals()。
在内部Except()使用Set<>(您可以在此处看到),这是一个内部类,您应考虑与等效HashSet<>。此类使用对象的哈希值对它们进行“索引”,然后使用Equals()来检查具有相同哈希值的两个对象是否相同或不同,但具有相同的哈希值。
链接到其他相关答案:https : //stackoverflow.com/a/371348/613130
| 归档时间: |
|
| 查看次数: |
828 次 |
| 最近记录: |