我有两个列表
List<T> list1 = new List<T>();
List<T> list2 = new List<T>();
我想删除list1中的所有元素,它们也存在于list2中。当然我可以遍历第一个循环来查找list2中的每个元素,但我正在寻找优雅的解决方案。
谢谢!
答案 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