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();
}
}