Gebruik LINQ om items in de ene lijst<> te krijgen, die niet in een andere lijst<> staan

 C Programming >> C Programmeren >  >> Tags >> LINQ
Gebruik LINQ om items in de ene lijst<> te krijgen, die niet in een andere lijst<> staan

Dit kan worden aangepakt met de volgende LINQ-uitdrukking:

var result = peopleList2.Where(p => !peopleList1.Any(p2 => p2.ID == p.ID));

Een alternatieve manier om dit via LINQ uit te drukken, wat sommige ontwikkelaars leesbaarder vinden:

var result = peopleList2.Where(p => peopleList1.All(p2 => p2.ID != p.ID));

Als u de gelijkheid van Mensen overschrijft, kunt u ook het volgende gebruiken:

peopleList2.Except(peopleList1)

Except zou aanzienlijk sneller moeten zijn dan de Where(...Any) variant omdat het de tweede lijst in een hashtabel kan plaatsen. Where(...Any) heeft een looptijd van O(peopleList1.Count * peopleList2.Count) terwijl varianten gebaseerd op HashSet<T> (bijna) een runtime hebben van O(peopleList1.Count + peopleList2.Count) .

Except verwijdert impliciet duplicaten. Dat zou geen invloed moeten hebben op uw zaak, maar kan een probleem zijn voor soortgelijke gevallen.

Of als u snelle code wilt, maar de gelijkheid niet wilt overschrijven:

var excludedIDs = new HashSet<int>(peopleList1.Select(p => p.ID));
var result = peopleList2.Where(p => !excludedIDs.Contains(p.ID));

Deze variant verwijdert geen duplicaten.


Of als je het wilt zonder ontkenning:

var result = peopleList2.Where(p => peopleList1.All(p2 => p2.ID != p.ID));

In feite zegt het alles van peopleList2 te krijgen, waarbij alle id's in peopleList1 anders zijn dan id in peoplesList2.

Net een beetje andere benadering dan het geaccepteerde antwoord :)