19

我有 2 个共享相同属性的不同对象 ( foo& bar) 列表让我们调用它id

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

我想从中删除所有foo具有不存在的 id 的对象bar

如何在 linq 中做到这一点?我一直在查看Intersect,但找不到任何列表类型不同的示例RemoveAllJoin

4

2 回答 2

30

试试这个:

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

于 2013-10-04T07:05:56.887 回答
8
var foo = foo.Where(f => !bar.Any(b => b.Id == f.Id)).ToList();

请记住,这是一个 O(n²) 解决方案,它不适用于大列表。

于 2013-10-04T07:07:32.823 回答