繁体   English   中英

LINQ Except()方法不起作用

[英]LINQ Except() Method Does Not Work

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

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

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

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

来自MSDN

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

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

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

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

除了适用于价值类型。 但是,由于您使用的参考类型,你需要重写EqualsGethashCodeItemsDTO为了得到这个工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM