我有 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 所说,第一个解决方案适用于小列表,第二个解决方案对于大列表更有效。
var foo = foo.Where(f => !bar.Any(b => b.Id == f.Id)).ToList();
请记住,这是一个 O(n²) 解决方案,它不适用于大列表。