LINQ Except()方法不起作用

我有2个IList相同类型的对象ItemsDTO 。 我想从另一个列表中排除一个列表。 然而,这对我来说似乎没有用,我想知道为什么?

 IList related = itemsbl.GetRelatedItems(); IList relating = itemsbl.GetRelatingItems().Except(related).ToList(); 

我正在尝试从relating列表中删除related项目。

由于class是引用类型,因此ItemsDTO类必须重写EqualsGetHashCode才能使用它。

来自MSDN :

通过使用默认的相等比较器来比较值,生成两个序列的集合差异。

默认的相等比较器将成为参考比较。 因此,如果这些列表彼此独立地填充,则它们可能包含从您的角度来看的相同对象,但不同的引用

当您对SQL Server使用LINQ时,您可以利用LINQ将LINQ语句转换为可以基于主键或值比较器为您执行逻辑相等的SQL查询。 使用LINQ to Objects,您需要定义ItemsDTO逻辑相等的含义。 这意味着重写Equals()以及GetHashCode()

除了适用于价值类型。 但是,由于您使用的是Ref类型,因此需要在GethashCode上覆盖EqualsGethashCode以使其工作

我刚遇到同样的问题。 显然.NET认为一个列表中的项目与另一个列表中的相同项目不同(即使它们实际上是相同的)。 这是我做的修复它:

让你的类inheritanceIEqualityComparer ,例如。

 public class ItemsDTO: IEqualityComparer { public bool Equals(ItemsDTO x, ItemsDTO y) { if (x == null || y == null) return false; return ReferenceEquals(x, y) || (x.Id == y.Id); // In this example, treat the items as equal if they have the same Id } public int GetHashCode(ItemsDTO obj) { return this.Id.GetHashCode(); } }