从另一个IList 中删除一个IList 中的项

很抱歉发布这样的基本问题,我是LINQ的新手,我正试图找出最好的方法来完成每个IList的循环。

我有两个ILists与自定义dto对象。 我想从列表中删除另一个中的所有匹配项。

 IList list1 = itemsbl.GetBestItems(); IList list2 = itemsbl.GetWorstItems(); 

我需要从list2删除list1中的所有项目。 我一直在看Except()方法,但显然我需要我的ItemsDTO类来覆盖GetHashCodeEquals方法,但是我找不到这方面的例子。

有人可以告诉我从list2删除list1的最佳方法吗?

再次感谢

您可以使用Except方法执行此操作。

 var newList = list2.Except(list1).ToList(); 

如果你想替换list2,那么就这样做:

 list2 = list2.Except(list1).ToList(); 

来自MSDN:

要比较自定义数据类型,请实现IEquatablegenerics接口,并为该类型提供自己的GetHashCode和Equals方法。 默认的相等比较器Default用于比较实现IEquatable的类型的值。

 var list1 = new List { "A", "B", "C" }; var list2 = new List { "A", "C", "E", "B", "D", "G", "F" }; list2.RemoveAll(list1.Contains); 

也会奏效。 请注意,list1.Contains实际上是一个lambda

 s => list1.Contains(s) 

-一个。

哈希绝对是一个好方法,@ Jon Skeet下面回答一个类似的问题会为你提供解决方案。

所以基本上语法是:

  var setToRemove = new HashSet(list1); list2.RemoveAll(x => setToRemove.Contains(x)); 

使用LINQ从List 中删除元素

希望这会有所帮助。

这意味着你需要告诉.net运行时如何确定一个类的两个实例是否相等(例如,它应该如何定义ItemDTO的一个实例是否等于另一个ItemDTO实例)。

为此,重写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,有关详细信息,请参阅下面的链接。

请参阅重载等于和GetHashcode的指南