从另一个列表中删除对象列表

问题描述:

我一直在寻找那样的天。我试图从列表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。

+1

问题是Contains,因为两个列表不包含相同的对象(可能是同一个类的另一个实例,但具有相同的数据)。 – HiperiX

+0

是否覆盖了Obj类型的Equals/GetHashcode以使用ID字段而不是从System.Object继承的方法? –

+0

我的对象获得了相同的类型,但内容不同,只需比较这些ID而不是整个对象。只是遵循IAbstract〜的答案,像一个魅力工作......谢谢,伙计们! –

你需要比较的ID:

listA.RemoveAll(x => !listB.Any(y => y.ID == x.ID)); 

List(T).RemoveAll

+0

工作就像一个魅力!感谢大家的帮助! –

+0

什么是RemoveAll扩展方法的命名空间?我没有它。 – Arash

+0

Arash,它是List的一部分。我敢打赌你可能需要在IEnumerable上调用.ToList() – Joe

根据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

我相信你可以使用除了扩展做到这一点。

var result = listA.Except(listB) 

参考:http://www.dotnetperls.com/except

如果你想从另一个列表中(listA)删除对象(listB)的列表使用:

listA = listA.Except(listB).ToList() 

记住使用ToList()转换IEnumerable<Obj>List<Obj>