@smaclell a demandé pourquoi l'itération inverse était plus efficace dans un commentaire à @sambo99.
Parfois c'est plus efficace. Considérons que vous avez une liste de personnes et que vous voulez supprimer ou filtrer tous les clients ayant une cote de crédit < 1000 ;
Nous disposons des données suivantes
"Bob" 999
"Mary" 999
"Ted" 1000
Si nous devions itérer vers l'avant, nous aurions rapidement des problèmes.
for( int idx = 0; idx < list.Count ; idx++ )
{
if( list[idx].Rating < 1000 )
{
list.RemoveAt(idx); // whoops!
}
}
A idx = 0, on enlève Bob
qui décale alors tous les éléments restants vers la gauche. Au prochain passage de la boucle, idx = 1, mais liste[1] est maintenant Ted
au lieu de Mary
. On finit par sauter Mary
par erreur. Nous pourrions utiliser une boucle while, et nous pourrions introduire plus de variables.
Ou alors, on inverse l'itération :
for (int idx = list.Count-1; idx >= 0; idx--)
{
if (list[idx].Rating < 1000)
{
list.RemoveAt(idx);
}
}
Tous les index à gauche de l'élément supprimé restent les mêmes, de sorte que vous ne sautez aucun élément.
Le même principe s'applique si l'on vous donne une liste d'index à supprimer d'un tableau. Pour que les choses restent claires, vous devez trier la liste, puis supprimer les éléments de l'indice le plus élevé au plus bas.
Maintenant, vous pouvez simplement utiliser Linq et déclarer ce que vous faites d'une manière directe.
list.RemoveAll(o => o.Rating < 1000);
Pour ce cas de suppression d'un seul élément, il n'est pas plus efficace d'itérer en avant ou en arrière. Vous pourriez également utiliser Linq pour cela.
int removeIndex = list.FindIndex(o => o.Name == "Ted");
if( removeIndex != -1 )
{
list.RemoveAt(removeIndex);
}
88 votes
J'adore les noms de variables. Je n'aimerais pas être l'imbécile qui se fait supprimer, par contre.
0 votes
Ajoutez une instruction break lors d'une recherche réussie si vous envisagez de procéder de cette manière, bien que l'utilisation d'un dictionnaire soit probablement préférable de toute façon si vous recherchez toujours les choses par le nom du membre.
0 votes
Je pense que vous vouliez dire RemoveAt() dans votre extrait de code, puisque vous passez l'index. Une fois que l'élément est connu, vous pouvez appeler Remove() directement.
1 votes
Cette question devrait être clarifiée. Avec quel framework .Net les réponses traitent-elles ? Parlons-nous de List<T> ou d'une autre structure implémentant IList<T> - Cette question devrait probablement être renommée en "Quelle est la meilleure façon de supprimer des éléments d'une List<T> en .net 3.0 ?".