Remove items in one IList<> from another IList<>
很抱歉,我对Linq不熟悉,我想找出最好的方法来解决这个问题,只需在每个
我有2个带有自定义DTO对象的
1 2 | IList<ItemDTO> list1 = itemsbl.GetBestItems(); IList<ItemDTO> list2 = itemsbl.GetWorstItems(); |
我需要把
有人能告诉我把
再次感谢
您可能可以使用except方法来执行此操作。
1 | var newList = list2.Except(list1).ToList(); |
如果要替换列表2,请执行以下操作:
1 | list2 = list2.Except(list1).ToList(); |
来自MSDN:
To compare custom data types, implement the IEquatable generic
interface and provide your own GetHashCode and Equals methods for the
type. The default equality comparer, Default, is used to compare
values of types that implement IEquatable.
1 2 3 |
也会有用的。注意,list1.contains实际上是一个lambda
1 | s => list1.Contains(s) |
-A
"绝对是个好办法,"@jon skeet在下面回答一个类似的问题,会给你提供解决方案。
所以基本上,语法是:
1 2 |
使用LINQ从列表中删除元素
希望这有帮助。
它的意思是,您需要告诉.NET运行时如何确定一个类的两个实例是否相等(例如,它应该如何定义itemdto的一个实例是否等于itemdto的另一个实例)。
为此,重写等于
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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的指导原则