[英]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
类必须重写Equals
和GetHashCode
才能使用它。
来自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();
}
}
除了适用于价值类型。 但是,由于您使用的参考类型,你需要重写Equals
和GethashCode
您ItemsDTO
为了得到这个工作
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.