假设我有LINQ查询,例如:
var authors = from x in authorsList
where x.firstname == "Bob"
select x;
鉴于 authorsList
的类型为 List<Author>
,如何将查询返回的 Author
中的 Author
元素删除到 authors
?
或者,换句话说,如何从 authorsList
删除所有名字等于Bob?
注意:这是用于问题目的的简化示例 .
15 回答
简单解决方案
我想你可以做这样的事情
虽然我认为已经给出的解决方案以更易读的方式解决了问题 .
您可以通过两种方式删除
要么
我有同样的问题,如果你想根据你的条件得到简单的输出,那么第一个解决方案就更好了 .
最好使用List<T>.RemoveAll来实现这一目标 .
如果你真的需要删除项目,那么Except()呢?
您可以根据新列表删除,或通过嵌套Linq即时删除 .
嗯,首先排除它们会更容易:
但是,这只会改变
authorsList
的值,而不是从前一个集合中删除作者 . 或者,您可以使用RemoveAll:如果你真的需要基于另一个集合来做,我会使用HashSet,RemoveAll和Contains:
我在游荡,如果RemoveAll和Except以及使用HashSet的优点之间有任何区别,那么我已经做了快速的性能检查:)
结果如下:
我们可以看到,在这种情况下最好的选择是使用 RemoveAll( HashSet )
很简单:
您无法使用标准LINQ运算符执行此操作,因为LINQ提供查询,而不是更新支持 .
但是您可以生成一个新列表并替换旧列表 .
或者你可以在第二遍中删除
authors
中的所有项目 .LINQ起源于函数式编程,它强调对象的不变性,因此它没有提供内置的方法来就地更新原始列表 .
关于不变性的注释(取自另一个SO答案):
以下是维基百科的不变性定义(链接)
“在面向对象和函数式编程中,不可变对象是一个对象,其状态在创建后无法修改 . ”
下面是从列表中删除元素的示例 .
假设
authorsToRemove
是IEnumerable<T>
,其中包含要从authorsList
中删除的元素 .然后,这是完成OP提出的删除任务的另一种非常简单的方法:
这是一个非常古老的问题,但我发现了一个非常简单的方法:
请注意,由于返回变量
authorsList
是List<T>
,Except()
返回的IEnumerable<T>
必须转换为List<T>
.我认为您只需将作者列表中的项目分配给新列表即可实现此效果 .
为了保持代码流畅(如果代码优化并不重要),您需要在列表上进行一些进一步的操作:
要么