删除一个IList<>;来自另一IList<>;
本文关键字:lt gt IList 一个 删除 | 更新日期: 2023-09-27 18:24:51
很抱歉发布这样的基本问题,我是LINQ的新手,正在努力找出最好的方法来完成这项工作,而不是循环遍历每个IList
。
我有2个ILists<>
,其中包含个自定义dto对象。我想从另一个列表中的列表中删除所有匹配项。
IList<ItemDTO> list1 = itemsbl.GetBestItems();
IList<ItemDTO> list2 = itemsbl.GetWorstItems();
我需要从list2
中删除list1
中的所有项目。我一直在研究Except()
方法,但显然我需要我的ItemsDTO
类来覆盖GetHashCode
和Equals
方法才能工作,但我很难找到一些这样的例子。
有人能告诉我从list2
中删除list1
的最佳方法吗?
再次感谢
您可能可以使用Except方法来执行此操作。
var newList = list2.Except(list1).ToList();
如果你想替换list2,那么就这样做:
list2 = list2.Except(list1).ToList();
来自MSDN:
要比较自定义数据类型,请实现IEquatable泛型接口,并为类型默认的相等比较器default用于比较实现IEquatable的类型的值。
var list1 = new List<string> { "A", "B", "C" };
var list2 = new List<string> { "A", "C", "E", "B", "D", "G", "F" };
list2.RemoveAll(list1.Contains);
也会起作用。请注意,list1.Contains实际上是一个lambda
s => list1.Contains(s)
-A。
哈希绝对是一个好方法,@Jon Skeet下面对类似问题的回答将为您提供解决方案。
所以基本上语法是:
var setToRemove = new HashSet<ItemDTO>(list1);
list2.RemoveAll(x => setToRemove.Contains(x));
使用LINQ从List<T>
希望这能有所帮助。
这意味着你需要告诉.net运行时如何确定一个类的两个实例是否相等(例如,它应该如何定义一个ItemDTO实例是否等于另一个ItemDT实例)。
要执行此操作,请覆盖Equals
public class ItemDTO
{
public override bool Equals(object obj)
{
var otherItem = obj as ItemDTO;
if (otherItem == null)
{
// this will be because either 'obj' is null or it is not of type ItemDTO.
return false;
}
return otherItem.SomeProperty == this.SomeProperty
&& otherItem.OtherProperty == this.OtherProperty;
}
}
如果你不这样做,它只会删除列表中指向与另一个相同物理实例的任何引用。然后,您可以使用Except或RemoveAll方法,或者您决定使用的任何其他方法。
您还需要覆盖GetHashcode,请参阅下面的链接以获取更多信息。
请参阅重载Equals和GetHashcode 的指南