简体   繁体   中英

Remove items from list that intersect on property using Linq

I have 2 lists of different objects ( foo & bar ) that share the same property lets call it id .

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

I want to remove all objects from foo that have an id that does not exist in bar

How can this be done in linq? I have been looking at Intersect , RemoveAll & Join but cannot find any example where the lists are of a different type.

Try this:

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

!bar.Any(y=>y.Id==x.Id) will get if item is in bar collection and if it's not it will remove it from foo collection.

Better solution using hashset O(n):

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

source of second answer: https://stackoverflow.com/a/4037674/1714342

EDIT:

as @Carra said, first solution is good for small lists and second is more efficient for big lists.

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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