我有 2 个不同对象的列表(foo
和 bar
),它们共享相同的属性,我们称它为 id
。
public List<foo> foo { get; set; }
public List<bar> bar { get; set; }
我想从 foo
中删除所有对象,这些对象的 ID 在 bar
中不存在
如何在 linq 中完成此操作?我一直在查看 Intersect
、RemoveAll
和 Join
,但找不到列表属于不同类型的任何示例。
最佳答案
试试这个:
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/