C# LINQ Except()方法不起作用

C# LINQ Except()方法不起作用,c#,linq,linq-to-objects,C#,Linq,Linq To Objects,我有两个相同类型的对象ItemsDTO的IList。我想从另一个列表中排除一个列表。然而,这似乎不适合我,我想知道为什么 IList<ItemsDTO> related = itemsbl.GetRelatedItems(); IList<ItemsDTO> relating = itemsbl.GetRelatingItems().Except(related).ToList(); IList related=itemsbl.GetRelatedItems(); IL

我有两个相同类型的对象
ItemsDTO
IList
。我想从另一个列表中排除一个列表。然而,这似乎不适合我,我想知道为什么

IList<ItemsDTO> related = itemsbl.GetRelatedItems();
IList<ItemsDTO> relating = itemsbl.GetRelatingItems().Except(related).ToList();
IList related=itemsbl.GetRelatedItems();
IList relative=itemsbl.GetRelatingItems().Except(relative.ToList();
我正在尝试从
相关
列表中删除
相关
中的项目。

来自:

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

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


在对SQL Server使用LINQ时,您可以将LINQ语句转换为SQL查询,该查询可以基于主键或值比较器为您执行逻辑相等。使用LINQ to对象,您需要定义逻辑相等性对
ItemsDTO
意味着什么。这意味着重写
Equals()
以及
GetHashCode()
因为类是引用类型,所以您的
ItemsDTO
类必须重写
Equals
GetHashCode
才能工作。

对于值类型除外。但是,由于您使用的是Ref类型,因此需要在
项sdto
上覆盖
Equals
GethashCode
,以使其正常工作

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

让你的班级继承

公共类项目收件人:IEqualityComparer
{
公共布尔等于(ItemsDTO x,ItemsDTO y)
{
如果(x==null | | y==null)返回false;
return ReferenceEquals(x,y)| |(x.Id==y.Id);//在本例中,如果项具有相同的Id,则将它们视为相等
}
public int GetHashCode(ItemsDTO obj)
{
返回此.Id.GetHashCode();
}
}

我认为仅覆盖Equals就足够了。为什么你认为你需要重写GetHashCode?@gprasant
除了内部使用
哈希集之外。@Magnus:Gosh,你怎么知道的?无论如何,出于性能方面的原因?@gprasant否,如果两个相等的对象返回不同的哈希代码,
HashSet
根本不起作用。
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();
  }
}