2009-06-07 15 views
8

Ho il seguente elenco generico che è popolata con una lista di stringhe:come modificare gli elementi in un Elenco generico usando foreach?

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

dire che voglio aggiungere 'test' alla fine di ogni stringa, come posso farlo in modo semplice? Intuitivamente, ho provato questo che compila ok:

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

Ma se poi guardo il contenuto della lista, non è cambiato nulla. Immagino che potrei usare un ciclo for per scorrere l'elenco, ma sto cercando qualcosa di molto semplice e usare ForEach sembra molto bello ... ma non sembra funzionare. Qualche idea?

risposta

14

Il problema è che il Action specificato viene eseguito sugli elementi di l'elenco, ma il risultato non viene ripristinato da nessuna parte ... il tuo s è solo una variabile locale.

Modifica della lista sul posto probabilmente avrà un vero e proprio foreach, ma se siete felice di prendere un nuovo elenco come risultato, si potrebbe provare:

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

Non proprio la stessa ... ma il più vicino possibile ...

+1

Come alternativa IEnumerable .Select (s => s + "test") ... –

9

Non è possibile farlo a meno che il tipo di elenco non sia un tipo di riferimento mutabile (e in tal caso, non è ancora possibile modificare il riferimento effettivo nell'elenco ma l'oggetto stesso).

Il motivo è che chiama un delegato Action<T> con la firma:

delegate void Action<T>(T obj); 

e qui, l'argomento è passato per valore (non è ref). Come qualsiasi metodo, non è possibile modificare l'argomento di input quando viene chiamata per valore:

Il codice è sostanzialmente equivalente a:

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

list.ForEach(anonymous_method); 
+0

Grazie per la spiegazione. Molto utile. – Anthony

+1

Ti ringrazio anche per la spiegazione ... Questa è la spiegazione più semplice che ho visto ... batte qualsiasi cosa e tutto su MSDN. Ta. – corlettk

+0

Sì, mi piace questa risposta, molto più pulita e intuitiva – Vincent

Problemi correlati