2008-10-15 9 views
5

He probado el siguiente código en LINQPad y tiene los resultados dados a continuación:¿Por qué mi intento de cortar cadenas en una lista <string> no parece funcionar?

List<string> listFromSplit = new List<string>("a, b".Split(",".ToCharArray())).Dump(); 
listFromSplit.ForEach(delegate(string s) 
{ 
    s.Trim(); 
}); 
listFromSplit.Dump(); 

"a" y "b"

por lo que la letra b no consiguieron el espacio en blanco eliminado como esperaba ...?

Alguien tiene alguna idea

[NOTA: el .dump() es un método de extensión en menthod LINQPad que imprime el contenido de cualquier objeto en una buena manera inteligente con formato]

+1

Las cadenas son inmutables. – mmcdole

Respuesta

10

El método String.Trim() devuelve una cadena que representa la cadena actualizada. No actualiza el objeto de cadena en sí, sino que crea uno nuevo.

Usted puede hacer esto:

s = s.Trim(); 

Sin embargo no se puede actualizar una colección al enumerar a través de él de modo que te gustaría o bien llenar una nueva lista al enumerar sobre la existente o rellenar la lista manualmente utilizando el conjunto de cadenas devuelto por String.Split.

Llenar una nueva lista:

List<string> temp = new List<string>("a, b".Split(",".ToCharArray())); 
List<string> listFromSplit = new List<string>(); 

temp.ForEach(delegate(string s) 
{ 
    listFromSplit.Add(s.Trim()); 
}); 

listFromSplit.Dump(); 

Rellenar manualmente:

string[] temp = "a, b".Split(",".ToCharArray()); 
List<string> listFromSplit = new List<string>(); 

foreach (string s in temp) 
{ 
    listFromSplit.Add(s.Trim()); 
}; 

listFromSplit.Dump(); 
+0

o hacer una para en lugar de foreach – nabeelfarid

17

sólo eres creando una cuerda recortada, sin asignarle nada.

var s = " asd "; 
s.Trim(); 

no se actualizará s, mientras que ..

var s = " asd "; 
s = s.Trim(); 

se ..

var listFromSplit = "a, b".Split(',').Select(s=>s.Trim()); 

sería, supongo, será cómo me gustaría ir al respecto.

1

No está asignando el resultado recortado a nada. Este es un error clásico, sólo he acabo de salir de la costumbre de hacer este error con String.Replace :)

2

Las instancias de cadenas son inmutables. Cualquier cosa que parezca modificar uno, crea una nueva instancia en su lugar.

0

Split, en ambos espacios y comas y elimine las entradas vacías. Todo bien y recortado. Sin embargo, supone que tus cadenas no contienen espacios.

List<string> listFromSplit = 
    new List<string>("a , b ".Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries)); 
1

no tengo IDE en marcha y funcionando, pero esto debe hacer el trabajo (a menos que me equivoque):

var result = from each in listFromSplit select each.Trim(); 
4

relación con la respuesta Publicado por Adrian Kuhn que podría hacer lo siguiente:

var result = listFromSplit.Select(s => s.Trim()); 
0

Las opciones de linq que otros han proporcionado deberían funcionar bien. Como otra opción, aquí hay un método de extensión que utiliza un bucle for:

public static void TrimCollection(this IList<string> stringCollection) { 

     for (int i = 0; i <= stringCollection.Count() - 1; i++) 
      stringCollection[i] = stringCollection[i].Trim(); 

    } 
Cuestiones relacionadas