Supprimer les éléments de la liste qui se croisent sur la propriété à l'aide de Linq
J'ai 2 listes d'objets différents (foo
& bar
) qui partagent la même propriété permet de l'appeler id
.
public List<foo> foo { get; set; }
public List<bar> bar { get; set; }
Je veux supprimer tous les objets de foo
qui ont un id qui n'existe pas dans bar
Comment cela peut-il être fait dans linq? J'ai été à la recherche à Intersect
, RemoveAll
& Join
mais ne peut pas trouver un exemple où les listes sont d'un type différent.
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
!bar.Any(y=>y.Id==x.Id)
obtiendrez si l'article est dans lebar
collection et si ce n'est pas ça le supprimefoo
collection.Meilleure solution à l'aide de hashset O(n):
source de deuxième réponse: https://stackoverflow.com/a/4037674/1714342
EDIT:
comme @Carra a dit, la première solution est bonne pour les petites listes et la deuxième est plus efficace pour les grandes listes.
Il suffit de garder à l'esprit que ce est un O(n2), il ne fonctionne pas très bien pour les grandes listes.
id
s debar
dans un hashset (O(n)), puis comparer chaque élément dansfoo
pour que (O(n)) plutôt que de la marche de labar
liste pour chaque élément dansfoo
new HashSet<int>(bar.Select(x => x.id))
doit faire, en supposant que vous n'avez pas de collisions