从其他列表中删除对象列表

时间:2011-10-03 16:28:21

标签: c# linq c#-4.0 c#-3.0

我好几天都在寻找类似的东西。我正在尝试根据列表B从较大的列表A中删除所有元素。

假设我得到一个包含100个不同IDS元素的通用列表,我得到另一个包含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。

4 个答案:

答案 0 :(得分:22)

您需要比较ID:

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

List(T).RemoveAll

答案 1 :(得分:3)

我相信您可以使用扩展程序来执行此操作。

var result = listA.Except(listB)

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

答案 2 :(得分:2)

如果要从其他列表(listB)中删除对象列表(listA),请使用:

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

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

答案 3 :(得分:0)

根据MSDN(http://msdn.microsoft.com/en-us/library/bhkz42b3.aspx)上的文档,contains使用默认的Equality comparer来确定相等性,因此您可以在Obj类上使用IEquatable的Equals方法使其工作。 HiperiX提到上面的参考比较。

如何添加IEquateable接口:http://msdn.microsoft.com/en-us/library/ms131190.aspx