Disons que j'ai une requête LINQ telle que:
var authors = from x in authorsList
where x.firstname == "Bob"
select x;
Étant donné que authorsList
c'est de type List<Author>
, comment puis-je supprimer leAuthor
éléments authorsList
qui sont retournés par la requête dans authors
?
Ou, en d'autres termes, comment puis-je supprimer tous les Bob égaux du prénom de authorsList
?
Remarque: Il s'agit d'un exemple simplifié aux fins de la question.
Contains
contrôle rapide et vous garantit de n'évaluer la séquence qu'une seule fois.List<T>
, c'est bien de l'utiliser.authorsList = authorsList.Where(x => x.FirstName != "Bob")
Il serait préférable d'utiliser List <T> .RemoveAll pour accomplir cela.
la source
Si vous avez vraiment besoin de supprimer des éléments, qu'en est-il d'Except ()?
Vous pouvez supprimer en fonction d'une nouvelle liste, ou supprimer à la volée en imbriquant le Linq.
la source
Except()
est le seul moyen d'aller au milieu de l'instruction LINQ.IEnumerable
n'a pasRemove()
niRemoveAll()
.Vous ne pouvez pas le faire avec les opérateurs LINQ standard car LINQ fournit une requête et non une mise à jour du support.
Mais vous pouvez générer une nouvelle liste et remplacer l'ancienne.
Ou vous pouvez supprimer tous les éléments
authors
dans un deuxième passage.la source
RemoveAll()
n'est pas un opérateur LINQ.Remove
est également une méthodeList
<T
>, pas une méthode System.Linq.Enumerable .Solution simple:
la source
Je me demandais s'il y avait une différence entre
RemoveAll
etExcept
et les avantages de l'utilisationHashSet
, j'ai donc effectué une vérification rapide des performances :)Résultats ci-dessous:
Comme nous pouvons le voir, la meilleure option dans ce cas est d'utiliser
RemoveAll(HashSet)
la source
l2.RemoveAll( new HashSet<string>( toRemove ).Contains );
compile bien juste FYIC'est une très vieille question, mais j'ai trouvé un moyen très simple de le faire:
Notez que puisque la variable de retour
authorsList
est unList<T>
, leIEnumerable<T>
retourné parExcept()
doit être converti en aList<T>
.la source
Vous pouvez supprimer de deux manières
ou
J'ai eu le même problème, si vous voulez une sortie simple basée sur votre condition Where, la première solution est meilleure.
la source
Disons que
authorsToRemove
c'est unIEnumerable<T>
qui contient les éléments que vous souhaitez supprimerauthorsList
.Ensuite, voici un autre moyen très simple d'accomplir la tâche de suppression demandée par l'OP:
la source
Je pense que vous pourriez faire quelque chose comme ça
Bien que je pense que les solutions déjà données résolvent le problème d'une manière plus lisible.
la source
Voici l'exemple pour supprimer l'élément de la liste.
la source
LINQ a ses origines dans la programmation fonctionnelle, qui met l'accent sur l'immuabilité des objets, donc il ne fournit pas un moyen intégré de mettre à jour la liste d'origine sur place.
Remarque sur l'immuabilité (tirée d'une autre réponse SO):
Voici la définition de l'immuabilité de Wikipédia .
la source
Je pense que vous n'avez qu'à affecter les éléments de la liste des auteurs à une nouvelle liste pour prendre cet effet.
la source
Pour garder le code fluide (si l'optimisation du code n'est pas cruciale) et vous devrez effectuer d'autres opérations sur la liste:
ou
la source