user2704766
user2704766

Reputation: 275

LINQ select List where sub-list contains item from another list

I can't wrap my head around how to create this query. I need to select the items in List 1, if the items Cats list contains a Cat object matching the ID of one of the Cats in List2. Is this possible? Thank you

List1<pet> List1 = new List<pet>(100);
List2<cat> List2 = new List<cat>(30);

//populate lists, some of the items in List2 (cat) will be in the List1 items Cats list

//classes
class pet{
   string ID;
   List<cat> Cats;
}

class cat {
   string ID;
   string name;
}

Upvotes: 9

Views: 29850

Answers (3)

MarengoHue
MarengoHue

Reputation: 1825

You can just use following LINQ expression:

List1.Where(p => p.Cats.Any(c => List2.Any(c2 => c2.ID == c.ID)));

You should also be able to do that with intersect (That is if your classes have their Equals methods overriden to check for matching IDs - see Intersect on MSDN):

List1.Where(p => p.Cats.Intersect(List2).Any())

Upvotes: 19

Alexander Derck
Alexander Derck

Reputation: 14488

This should work with nested Any:

var result = List1.Where(p => List2.Any(l => p.Cats.Any(c => c.ID == l.ID)));

Upvotes: 4

Marko Juvančič
Marko Juvančič

Reputation: 5890

Try this

var naughtycats = List1.Where(pet => List2.Select(cat => cat.ID).Contains(pet.ID));

Upvotes: 1

Related Questions