从一个List <t>中删除在另一个</t>中找到的元素

时间:2012-02-15 14:46:49

标签: c#

我有两个列表

 List<T> list1 = new List<T>();
 List<T> list2 = new List<T>();

我想删除list1中的所有元素,它们也存在于list2中。当然我可以遍历第一个循环来查找list2中的每个元素,但我正在寻找优雅的解决方案。

谢谢!

8 个答案:

答案 0 :(得分:38)

要更改实际的list1,您可以使用

list1.RemoveAll(item => list2.Contains(item));

您可能更愿意只是对列表进行查询而不修改

var result = list1.Except(list2);

LukeH在评论中提出了一个很好的建议。在第一个版本中,如果list2特别大,那么在HashSet<T>调用之前将列表加载到RemoveAll可能是值得的。如果列表很小,请不要担心。如果您不确定,请测试两种方式,然后您就会知道。

var theSet = new HashSet<YourType>(list2);
list1.RemoveAll(item => theSet.Contains(item));

答案 1 :(得分:7)

使用LINQ:

var result = list1.Except(list2);

答案 2 :(得分:5)

list1.RemoveAll( item => list2.Contains(item));

答案 3 :(得分:2)

描述

我认为你的意思是通用类型List<Type>。您可以使用Linq执行此操作

示例

List<string> l = new List<string>();
List<string> l2 = new List<string>();

l.Add("one");
l.Add("two");
l.Add("three");

l2.Add("one");
l2.Add("two");
l2.Add("three");
l2.Add("four");

l2.RemoveAll(x => l.Contains(x));

更多信息

答案 4 :(得分:2)

var result = list1.Except(list2);

答案 5 :(得分:1)

使用LINQ,您可以这样做:

 List1.RemoveAll(i => !List2.Contains(i));

答案 6 :(得分:0)

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

list1 = list1.Except(list2).ToList()

请务必使用ToList()IEnumerable<T>转换为List<T>

答案 7 :(得分:0)

{word} ({lang})

使用LINQ