从一个List 中删除在另一个List中找到的元素

我有两个清单

List list1 = new List(); List list2 = new List(); 

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

谢谢!

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

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

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

 var result = list1.Except(list2); 

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

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

使用LINQ:

 var result = list1.Except(list2); 
 list1.RemoveAll( item => list2.Contains(item)); 

描述

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

样品

 List l = new List(); List l2 = new List(); 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)); 

更多信息

  • MSDN – List.RemoveAll方法
 var result = list1.Except(list2); 

使用LINQ,您可以这样做:

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

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

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

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