2011-02-02 21 views
6

Quiero recortar cualquier espacio en blanco de una colección de cadenas. Usé el siguiente código pero parece que no funciona. ¿Alguien podría explicar por qué?No entiendo por qué el comando ForEach no funciona

result.ForEach(f => f = f.Trim()); 
+0

similares (pero para Java): http://stackoverflow.com/questions/48 51663/iteration-of-liststring-with-modyfing-string – finnw

+1

Solo use "ForEach" y "foreach" para * read * de una lista; como has descubierto, no funciona bien * escribir * en una lista. Como solución alternativa, ¿podría recortar la cadena * antes * de entrar en la lista? Entonces ni siquiera necesita hacer esta operación. –

Respuesta

10

Esto no va a funcionar porque está asignando una nueva cadena de referencia a una variable local. Esto es probablemente lo que busca:

result = result.Select(f => f.Trim()).ToList(); 
+1

Gracias - Me puso en el camino correcto, pero lo hice de la siguiente manera ... result = result.ConvertAll (f => f.Trim()); –

+0

@Mark - Eso debería ser un poco más eficiente. Por supuesto, sacrificas la versatilidad de 'Seleccionar' pero si necesitas una' Lista 'eso no es un problema. – ChaosPandion

2

Está reasignando la variable de argumento dentro del alcance de la lambda. Es una forma contraída de:

foreach(string value in myList) 
{ 
    Lambda(value); 
} 

void Lambda(string input) 
{ 
    input = input.Trim(); 
} 

La forma más simple, probablemente sería usar una proyección:

myList = myList.Select(str => str.Trim()).ToList(); 
+0

Gracias Rex - ¿Hay alguna manera de lograr lo que quiero y seguir usando la expresión lamda? –

+0

Gracias por la ayuda - Te di +1 –

1

foreach no da acceso de escritura a la colección subyacente, sólo se itera a través de ella, lo que significa que su cambio no se almacena de nuevo en la colección.

Puede hacer dos cosas:

  1. producir una nueva colección

    var newResult = result.Select(f => f.Trim()).ToList(); 
    
  2. uso normal de bucle y cambiar la colección original

    for (int index = 0; index < result.Count; index++) 
        result[index] = result[index].Trim(); 
    
Cuestiones relacionadas