2009-12-30 15 views

risposta

12

Select non modifica la collezione originale; crea un nuovo oggetto IEnumerable <T> che è possibile enumerare con un foreach o convertire in un elenco:

List<String> test2 = test.Select(s => String.Format("Hello {0}", s)).ToList(); 

prova contiene ancora "Luke" e "Leia" e test2 contiene "Ciao Luca" e "Ciao Leia".


Se si desidera modificare l'elenco originale con un'espressione lambda, è possibile applicare l'espressione lambda per ogni voce dell'elenco singolarmente e memorizzare il risultato di nuovo nella collezione:

Func<string, string> f = s => String.Format("Hello {0}", s); 

for (int i = 0; i < test.Count; i++) 
{ 
    test[i] = f(test[i]); 
} 
+0

Grazie, il primo è riuscito per me. –

+0

@Nyla Pareska: Quella versione non modifica la collezione originale che sembrava essere la tua intenzione ("ma non aggiusta i nomi nella lista"). Se si desidera farlo, vedere il metodo di estensione che ho fornito nella mia risposta. – jason

-2

si può solo fare una dichiarazione foreach:

test.ForEach(s=>String.Format("Hello {0}", s)); 

Questo è se si sta tentando di aggiornare solo i nomi.

+2

ForEach prende una 'Azione ' e non modifica l''Elenco ' – dtb

+1

String.Format restituisce una nuova stringa, ma non modifica la stringa originale. – M4N

+0

Ok, quindi aggiornalo come tale: s => s = String.Format ("Hello {0}", s)); Tutto dipende da ciò che voleva fare comunque, restituire una nuova lista con valori aggiornati o aggiornare l'elenco originale. –

3

Qui:

for(int i = 0; i < test.Count; i++) { 
    test[i] = String.Format("Hello {0}", test[i]); 
} 

Non c'è bisogno di essere di fantasia. Non c'è bisogno di abusare di LINQ. Basta che sia semplice.

Si potrebbe andare un passo oltre e creare un metodo di estensione in questo modo:

static class ListExtensions { 
    public static void AlterList<T>(this List<T> list, Func<T, T> selector) { 
     for(int index = 0; index < list.Count; index++) { 
      list[index] = selector(list[index]); 
     } 
    } 
} 

Usage:

test.AlterList(s => String.Format("Hello {0}", s)); 

Select è per la proiezione ed è veramente destinato ad essere utilizzato nei casi in cui non vi non ci sono effetti collaterali La manipolazione degli articoli nell'elenco ha chiaramente effetti collaterali. In realtà, la linea

test.Select(s => String.Format("Hello {0}", s)); 

non fa altro che creare un IEnumerable<string> che in futuro potrebbe essere enumerato sopra per produrre la proiezione.

+1

Non capisco come avrebbe abusato di LINQ. Lo userebbe esattamente come doveva essere usato. La sua domanda ha anche chiesto specificamente come eseguire l'attività utilizzando un'espressione lambda. –

+1

'Select' non è destinato a essere utilizzato per causare effetti collaterali. – jason

+0

@Downvoter: lascia un commento sul motivo per cui hai downvoted. – jason

0

Un'altra possibile soluzione:

List<String> test = new List<String> {"Luke", "Leia"}; 
List<string> FormattedStrings = new List<string>(); 
test.ForEach(testVal => FormattedStrings.Add(String.Format("Hello {0}", testVal)));