LINQ Exception()方法不起作用

本文关键字:方法 不起作用 Exception LINQ | 更新日期: 2023-09-27 18:24:39

我有两个相同类型的对象ItemsDTOIList<T>。我想从另一个列表中排除一个列表。然而,这似乎对我不起作用,我想知道为什么?

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

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

LINQ Exception()方法不起作用

由于类是引用类型,ItemsDTO类必须重写EqualsGetHashCode才能工作。

来自MSDN:

使用默认值生成两个序列的集差相等比较器,用于比较值。

默认相等比较器将是一个引用比较。因此,如果这些列表是相互独立填充的,从您的角度来看,它们可能包含相同的对象,但不同的引用

当您对SQL Server使用LINQ时,您可以将LINQ语句转换为SQL查询,该查询可以根据主键或值比较器为您执行逻辑相等。使用LINQ to Objects,您需要定义逻辑相等ItemsDTO意味着什么。这意味着要覆盖Equals()GetHashCode()

Except适用于值类型。但是,由于您使用的是Ref类型,因此需要覆盖ItemsDTO上的EqualsGethashCode,以便使其在

上工作

我刚刚遇到了同样的问题。显然,.NET认为一个列表中的项目与另一个列表的相同项目不同(尽管它们实际上是相同的)。这就是我修复它的方法:

让你的类继承IEqualityComparer<T>,例如

public class ItemsDTO: IEqualityComparer<ItemsDTO>
{
  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();
  }
}