关于c#:使用Linq从列表中删除与项目相交的项目

Remove items from list that intersect on property using Linq

我有两个不同对象列表(foobar共享同一属性,我们称之为id

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

我想删除foo中ID在bar中不存在的所有对象。

如何在Linq中实现这一点?我一直在看IntersectRemoveAllJoin,但找不到任何不同类型列表的例子。


试试这个:

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

如果想在!bar.Any(y=>y.Id==x.Id)get item是bar收集,如果它不想删除它从它的foo收集。

更好的解决方案hashset使用O(n):

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

源第二的答案:http://stackoverflow.com 1714342 4037674 / / /

编辑:

解决方案:为卡拉说,第一和第二个列表很小是更高效的大名单。


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

只是记住这是一个O(N2)的解决方案,它不会工作的很好大的列表。