2015-09-04 9 views
5

voglio filtrare un array di stringhe:modificare gli elementi della lista tra PerOgni lambda

string[] args 

dalla riga di comando, ad esempio: "-command1 xy -command2 ab -command3 cd"

prendendo tutte le parole con un '-' all'inizio, quindi convertendole in maiuscolo.

var commands = args.Where(x => x.StartsWith("-")).ToList<String>(); 
commands.ForEach(x => { 
    x.ToUpper() 
    }); 
commands.ToString(); 

Ciò restituirà la lista args con le parole che iniziano con '-' minuscolo - che è il lambda non viene applicata. Perchè è questo? Una copia dell'elenco viene creata per la cattura lambda, e questa viene modificata, non la lista originale stessa?

+2

1. Non sta impostando 'x.ToUpper()' per nulla. 2. Ma anche se lo facessi, non si compilerebbe: le stringhe sono immutabili. Dovresti fare ciò: 'var commands = args.Where (x => x.StartsWith (" - ")). Seleziona (x => x.ToUpper()). ToList();' – Rob

risposta

5
var commands = args.Where(x => x.StartsWith("-")).Select(y => y.ToUpper()).ToList(); 

o

var upperCommands = new List<String>(); 
var commands = args.Where(x => x.StartsWith("-")).ToList<String>(); 
    commands.ForEach(x => upperCommands.Add(
     x.ToUpper()); 
+3

Perché hai persino bisogno di citare la seconda opzione? Il primo è molto più semplice e facile da leggere. – ataravati

+1

@ataravati: completamente secondo quello che hai detto ... quella menzione era solo per la comprensione dell'OP. – DarkKnight

+0

ok, ho preso il primo. Non mi rendevo conto che selezionare era il metodo da usare - ho guardato in basso la lista intellisense e per qualche motivo l'ho confuso con il comportamento di questo, nonostante lo stia usando! – Prof

Problemi correlati