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

时间:2013-10-04 07:04:51

标签: c# linq

我有2个不同对象的列表(foo& bar),它们共享相同的属性,可以将其称为id

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

我想删除foobar

中不存在的ID Intersect的所有对象

如何在linq中完成?我一直在关注RemoveAllJoin&amp; {{1}}但找不到列表属于不同类型的任何示例。

2 个答案:

答案 0 :(得分:28)

试试这个:

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

答案 1 :(得分:8)

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

请记住,这是一个O(n²)解决方案,对大型列表来说效果不佳。