c# - 使用 Linq 从列表中删除与属性相交的项目

标签 c# linq

我有 2 个不同对象的列表(foobar),它们共享相同的属性,我们称它为 id

public List<foo> foo { get; set; }
public List<bar> bar { get; set; }

我想从 foo 中删除所有对象,这些对象的 ID 在 bar 中不存在

如何在 linq 中完成此操作?我一直在查看 IntersectRemoveAllJoin,但找不到列表属于不同类型的任何示例。

最佳答案

试试这个:

foo.RemoveAll(x=> !bar.Any(y=>y.Id==x.Id));

!bar.Any(y=>y.Id==x.Id) 将获取项目是否在 bar 集合中,如果不是,它将删除它来自 foo 集合。

使用哈希集 O(n) 的更好解决方案:

var idsNotToBeRemoved = new HashSet<int>(bar.Select(item => item.Id));                     
foo.RemoveAll(item => !idsNotToBeRemoved.Contains(item.Id));

第二个答案的来源:https://stackoverflow.com/a/4037674/1714342

编辑:

正如@Carra 所说,第一个解决方案适用于小列表,第二个解决方案对大列表更有效。

关于c# - 使用 Linq 从列表中删除与属性相交的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19175257/

相关文章:

c# - 使用 Enumerable.Range() 填充字典时出现问题

c# - AcroPDFlib、AxAcroPDFLib 商用

c# - NHibernate手动设置id自动递增

linq - 使用 LINQ to SQL 从存储过程中获取多维结果

.net - 为什么我不能将匿名类型作为参数传递给函数?

c# - 预应用程序启动初始化方法...运行WebActivatorEx.ActivationManager - 异常已被调用的目标抛出

c# - 如何在 C# 中处理 WM_SETCURSOR

c# - LINQ to Objects - 绑定(bind)到 ListView

.net - Linq:获取DataContext中所有表的列表

c# - 索引器属性的 Linq 表达式