2009-06-07 6 views
8

J'ai la liste générique suivante qui est remplie avec une liste de chaînes:comment modifier des éléments dans une liste générique en utilisant foreach?

List<string> mylist =new List<string>(); 
myList.add("string1"); 
myList.add("string2"); 

que je veux ajouter « test » à la fin de chaque chaîne, comment puis-je le faire d'une manière simple? Intuitivement, j'ai essayé ce qui compile ok:

myList.ForEach(s => s = s + "test"); 

Mais si je regarde alors le contenu de la liste, rien n'a changé. Je suppose que je pourrais utiliser une boucle for pour parcourir la liste, mais je cherche quelque chose de très simple et utiliser ForEach semble très soigné .... mais ne semble pas fonctionner. Des idées?

Répondre

14

Le problème est que le Action spécifié est exécuté sur les éléments de la liste, mais le résultat n'est pas remis n'importe où ... votre s est une variable locale seulement.

Modification de la liste en place aura probablement une foreach réelle, mais si vous êtes heureux de prendre une nouvelle liste à la suite, vous pouvez essayer:

list = list.ConvertAll(s => s + "test"); 

Pas tout à fait la même chose ... mais aussi près que vous aurez ...

+1

Comme alternative IEnumerable .Sélectionnez (s => s + "test") ... –

9

Ce n'est pas possible à moins que le type de liste ne soit un type de référence mutable (et dans ce cas, vous ne pouvez toujours pas modifier la référence réelle dans la liste mais l'objet lui-même).

La raison est que appelle un délégué Action<T> avec signature:

delegate void Action<T>(T obj); 

et ici, l'argument est passé par valeur (ce n'est pas ref). Comme toute méthode, vous ne pouvez pas changer l'argument d'entrée quand elle est appelée par valeur:

Le code est essentiellement équivalent à:

void anonymous_method(string s) { 
    s = s + "test"; // no way to change the original `s` inside this method. 
} 

list.ForEach(anonymous_method); 
+0

Merci pour l'explication. Très utile. – Anthony

+1

Je vous remercie également pour l'explication ... C'est l'explication la plus simple que j'ai vue ... bat tout et n'importe quoi sur MSDN. Ta. – corlettk

+0

Oui, j'aime cette réponse, beaucoup plus propre et intuitive – Vincent

Questions connexes