2010-08-18 6 views
2

J'ai un objet qui est contenu dans une liste <>, je dois supprimer ces d'une autre liste <>Suppression d'objets contenus dans une liste <> d'une autre liste <>?

par exemple

List<MyObject> AllElements = new List<MyObject>(); 
List<MyObject> SearchResults = new List<MyObject>(); 

... Faites quelque chose pour que SearchResults contient un sous-ensemble des objets contenus dans AllResults

Actuellement, je fais cela pour les supprimer de la liste principale:

for(int i = 0; i < SearchResults.Count; i++) 
    AllElements.Remove(SearchResults[i]); 

Y at-il un plus sympa [linqier!] façon?

Répondre

5

IEnumerable<T>.Except est votre ami (si je lis votre exemple correctement):

allElements = allElements.Except(searchResults); 
8

Vous pouvez utiliser le Enumerable.Except Method (MSDN)

Liste <MyObject> FilteredElements = AllElements.Except (SearchResults). Lister();

+0

Vous devez marquer un 'ToList' appel à la fin si vous voulez que le résultat soit une liste' ' plutôt que' 'IEnumerable . – LukeH

3

Ce qui suit vous donnera une 'liste' où tout dans SearchResults a été supprimé.

var results = AllElements.Where(i => !SearchResults.Contains(i)); 

Vous pouvez alors faire:

AllElements = results.AsList(); 
+1

Y a-t-il un avantage à utiliser Où/Contient simplement en utilisant Except? –

+1

@Justin, l'avantage pour moi était que je connaissais la façon 'Where()' de le faire. Je n'avais aucune idée que vous pouviez utiliser 'Except()'. J'ai posté ma réponse en même temps que votre, et je vais laisser tomber parce que c'est juste, et il est bon de savoir d'autres façons de faire les choses. – jjnguy

+3

(s): Il y a une différence sémantique entre eux aussi. 'Except' produit la différence d'ensemble des deux séquences, ce qui signifie que tous les doublons sont également supprimés. Par exemple, si les deux séquences sont '{1, 2, 3, 5, 1, 2, 4}' et '{3, 4}', l'utilisation de 'Except' vous donnera la séquence' {1, 2, 5 } 'alors que l'utilisation de' Where'/'Contains' vous donnera' {1, 2, 5, 1, 2} '. – LukeH

Questions connexes