48 votes

Liste C# - Suppression d'éléments lors d'une boucle / itération

Supposons que j'ai l'extrait de code suivant :

 var data=new List<string>(){"One","Two","Three"};
for(int i=0 ; i<data.Count ; i++){
  if(data[i]=="One"){
    data.RemoveAt(i);
  }
}

Le code suivant lève une exception.

Ma question est quelle est la meilleure façon d'éviter cette exception et de supprimer l'élément lors de la boucle?

107voto

ChrisF Points 74295

Si vous devez supprimer des éléments, vous devez effectuer une itération en arrière afin de pouvoir supprimer des éléments à la fin de la liste :

 var data=new List<string>(){"One","Two","Three"};
for(int i=data.Count - 1; i > -1; i--)
{
    if(data[i]=="One")
    {
        data.RemoveAt(i);
    }
}

Cependant, il existe des moyens plus efficaces de le faire avec LINQ (comme indiqué par les autres réponses).

45voto

Reed Copsey Points 315315

Vous pouvez utiliser List<T>.RemoveAll pour gérer cela :

 data.RemoveAll(elem => elem == "One");

10voto

Pushpendra Points 1587

Je suis tombé sur une solution simple pour cela en utilisant foreach et .ToArray()

   var data=new List<string>(){"One","Two","Three"};
   foreach ( var d in data.ToArray()){
      if(d =="One"){
        data.Remove(d);
      }
    }

4voto

Justin Niessner Points 144953

Vous pouvez essayer la méthode d'itération inverse de ChrisF pour supprimer votre élément.

Vous pouvez aussi simplement :

 List.Remove("One");

Ou:

 List.RemoveAll(i => i == "One"); // removes all instances

Et en finir avec ça. Il n'y a vraiment aucun intérêt à parcourir la collection pour supprimer un seul élément.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X