繁体   English   中英

使用Linq从属性上相交的列表中删除项目

[英]Remove items from list that intersect on property using 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集合中删除它。

使用hashset 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所说,第一种解决方案适用于小型列表,其次对大型列表更有效。

var foo = foo.Where(f => !bar.Any(b => b.Id == f.Id)).ToList();

请记住,这是一个O(n²)解决方案,它对大型列表不会很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM