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

C# 从另一个列表中删除对象列表,c#,linq,c#-4.0,c#-3.0,C#,Linq,C# 4.0,C# 3.0,我已经找了好几天了。我正试图根据列表B从更大的列表a中删除所有元素 假设我得到了一个包含100个元素和不同ID的通用列表,而我得到了另一个包含特定元素和10条记录的列表。我需要从第一个列表中删除第二个列表中不存在的所有元素 我将尝试向代码显示我实际上不知道它是如何工作的 List<Obj> listA = new List<Obj>(); List<Obj> listB = new List<Obj>(); //here I load my

我已经找了好几天了。我正试图根据列表B从更大的列表a中删除所有元素

假设我得到了一个包含100个元素和不同ID的通用列表,而我得到了另一个包含特定元素和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 listA=新列表();
List listB=新列表();
//在这里,我加载了包含许多元素的第一个列表
//在这里,我加载第二个列表,其中包含一些特定的元素
RemoveAll(x=>!listB.Contains(x));

我不知道为什么,但它不起作用。如果我用
列表
类型来尝试这个例子,它工作得很好,但我想用我的对象来做。此对象有一个ID,但我不知道如何在LINQ语句中使用此ID。

您需要比较ID:

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

根据MSDN()上的文档,contains使用默认的相等比较器来确定相等,因此您可以在Obj类上使用IEquatable的Equals方法使其工作。HiperiX提到了上面的ref比较


如何添加iEquatable接口:

我相信您可以使用扩展来完成此操作

var result = listA.Except(listB)

参考:

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


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

问题在于包含,因为两个列表不包含相同的对象(可能是同一类的另一个实例,但数据相同)。您是否在Obj类型上重写Equals/GetHashcode以使用ID字段而不是从System.Object继承的方法?我的对象具有相同的类型但内容不同,只是需要比较ID,而不是整个对象。只需按照IAbstract~回答,然后像个魔术师一样工作。。。谢谢,伙计们!工作得很有魅力!!谢谢大家的帮助!RemoveAll扩展方法的名称空间是什么?我没有,阿拉什,这是名单的一部分。我打赌您可能需要在IEnumerable上调用.ToList()
listA = listA.Except(listB).ToList()