从另一个列表中删除对象列表
问题描述:
我一直在寻找那样的天。我试图从列表B中删除更大的列表A中的所有元素。从另一个列表中删除对象列表
假设我得到了一个包含具有不同IDS的100个元素的通用列表,并且我只用10个记录得到了具有特定元素的另一个列表。我需要从第一个列表中删除第二个列表中不存在的所有元素。
我会试着展示我实际上不知道它如何工作的代码。
List<Obj> listA = new List<Obj>();
List<Obj> listB = new List<Obj>();
//here I load my first list with many elements
//here I load my second list with some specific elements
listA.RemoveAll(x => !listB.Contains(x));
我不知道为什么,但它不工作。如果我用List<int>
类型尝试这个例子,它很好地工作,但我想用我的对象来做到这一点。这个对象有一个ID,但我不知道如何在LINQ语句中使用这个ID。
答
答
根据MSDN上(http://msdn.microsoft.com/en-us/library/bhkz42b3.aspx)的文档,包含使用默认的相等比较确定的平等,所以你可以使用IEquatable的equals方法在你的Obj课上让它工作。 HiperiX提到了上面的ref比较。
如何添加IEquateable接口:http://msdn.microsoft.com/en-us/library/ms131190.aspx
答
如果你想从另一个列表中(listA
)删除对象(listB
)的列表使用:
listA = listA.Except(listB).ToList()
记住使用ToList()转换IEnumerable<Obj>
到List<Obj>
。
问题是Contains,因为两个列表不包含相同的对象(可能是同一个类的另一个实例,但具有相同的数据)。 – HiperiX
是否覆盖了Obj类型的Equals/GetHashcode以使用ID字段而不是从System.Object继承的方法? –
我的对象获得了相同的类型,但内容不同,只需比较这些ID而不是整个对象。只是遵循IAbstract〜的答案,像一个魅力工作......谢谢,伙计们! –