从列表中删除非常见项目

Lui*_*cia 1 c# linq

我有两个对象列表,其中一个对象具有不同数量的项目.现在,如果我这样做:

 var result = list1.Except(list2);
Run Code Online (Sandbox Code Playgroud)

这会给我list1中的项目与list2中的项目之间的区别,对吧?如果可能的话,我想做的是从list1中删除同一步骤中的所有项目.我不想做的是必须遍历"结果"列表并从list1中删除它们.那可能吗?

谢谢!

Tim*_*ter 7

你可以使用List.RemoveAll:

list1.RemoveAll(t => !list2.Contains(t));
Run Code Online (Sandbox Code Playgroud)

这不需要创建一个新集合,它也只需要一个循环来删除list1中但不在list2中的所有项.但是,我认为你误解了LINQ是如何工作的.Enumerable.Except使用延迟执行实现.这意味着它不会被执行直到foreach.Except对于大型列表也非常有效,因为它使用了set方法.


Cod*_*aos 6

Tim的解决方案是正确的,但运行时间为O(list1.Length*list2.Length).当你使用HashSet<T>带有正确哈希的a时,你会接近O(O(list1.Length + list2.Length)运行时.当list2包含多个项目时,这会快得多.

我的变体的缺点是它需要分配hashset,因此需要更多的内存.

var set2 = new HashSet<T>(list2);
list1.RemoveAll(item=>!set2.Contains(item));
Run Code Online (Sandbox Code Playgroud)