LINQ Except()方法不起作用

时间:2012-02-15 17:15:58

标签: c# linq linq-to-objects

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

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

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

4 个答案:

答案 0 :(得分:11)

由于class是引用类型,因此ItemsDTO类必须覆盖EqualsGetHashCode才能生效。

答案 1 :(得分:1)

来自MSDN

  

使用默认值生成两个序列的集合差异   等于比较来比较值。

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

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

答案 2 :(得分:0)

除了适用于价值类型。但是,由于您使用的是Ref类型,因此需要覆盖Equals上的GethashCodeItemsDTO才能使其生效

答案 3 :(得分:0)

我遇到了同样的问题。显然.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();
  }
}