我有2 IList<T>
个相同类型的对象ItemsDTO
。我想从另一个列表中排除一个列表。然而,这对我来说似乎没有用,我想知道为什么?
IList<ItemsDTO> related = itemsbl.GetRelatedItems();
IList<ItemsDTO> relating = itemsbl.GetRelatingItems().Except(related).ToList();
我正在尝试从related
列表中删除relating
中的项目。
答案 0 :(得分:11)
由于class是引用类型,因此ItemsDTO
类必须覆盖Equals
和GetHashCode
才能生效。
答案 1 :(得分:1)
来自MSDN:
使用默认值生成两个序列的集合差异 等于比较来比较值。
默认相等比较器将成为参考比较。因此,如果这些列表彼此独立地填充,它们可能包含您的视角相同的对象,但不同的引用。
当您对SQL Server使用LINQ时,您可以利用LINQ将LINQ语句转换为可以基于主键或值比较器为您执行逻辑相等的SQL查询。使用LINQ to Objects,您需要定义逻辑相等对ItemsDTO
的含义。这意味着覆盖Equals()
以及GetHashCode()
。
答案 2 :(得分:0)
除了适用于价值类型。但是,由于您使用的是Ref类型,因此需要覆盖Equals
上的GethashCode
和ItemsDTO
才能使其生效
答案 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();
}
}