LINQ Exception()方法不起作用
本文关键字:方法 不起作用 Exception LINQ | 更新日期: 2023-09-27 18:24:39
我有两个相同类型的对象ItemsDTO
的IList<T>
。我想从另一个列表中排除一个列表。然而,这似乎对我不起作用,我想知道为什么?
IList<ItemsDTO> related = itemsbl.GetRelatedItems();
IList<ItemsDTO> relating = itemsbl.GetRelatingItems().Except(related).ToList();
我正在尝试从relating
列表中删除related
中的项目。
由于类是引用类型,ItemsDTO
类必须重写Equals
和GetHashCode
才能工作。
来自MSDN:
使用默认值生成两个序列的集差相等比较器,用于比较值。
默认相等比较器将是一个引用比较。因此,如果这些列表是相互独立填充的,从您的角度来看,它们可能包含相同的对象,但不同的引用。
当您对SQL Server使用LINQ时,您可以将LINQ语句转换为SQL查询,该查询可以根据主键或值比较器为您执行逻辑相等。使用LINQ to Objects,您需要定义逻辑相等对ItemsDTO
意味着什么。这意味着要覆盖Equals()
和GetHashCode()
。
Except适用于值类型。但是,由于您使用的是Ref类型,因此需要覆盖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();
}
}