¿Por qué mi intento de recortar cadenas en una Lista < string > no parece funcionar?
-
03-07-2019 - |
Pregunta
Probé el siguiente código en LINQPad y obtuve los siguientes resultados:
List<string> listFromSplit = new List<string>("a, b".Split(",".ToCharArray())).Dump();
listFromSplit.ForEach(delegate(string s)
{
s.Trim();
});
listFromSplit.Dump();
" a " y " b "
¿entonces la letra b no eliminó el espacio en blanco como esperaba ...?
Alguien tiene alguna idea
[NOTA: el método .Dump () es una extensión menthod en LINQPad que imprime el contenido de cualquier objeto de una forma agradablemente formateada de forma inteligente]
Solución
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.
Podrías hacer esto:
s = s.Trim();
Sin embargo, no puede actualizar una colección mientras se enumera a través de ella, por lo que querrá completar una nueva Lista mientras enumera sobre la existente o completar la Lista manualmente utilizando la matriz de cadenas devuelta 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();
Otros consejos
solo está creando una cadena recortada, sin asignarle nada.
var s = " asd ";
s.Trim();
no actualizará s, mientras que ...
var s = " asd ";
s = s.Trim();
will ..
var listFromSplit = "a, b".Split(',').Select(s=>s.Trim());
supongo que sería como lo haría.
Además de la respuesta publicada por Adrian Kuhn puede hacer lo siguiente:
var result = listFromSplit.Select(s => s.Trim());
Las instancias de cadena son inmutables. Todo lo que parece modificar uno crea una nueva instancia en su lugar.
No está asignando el resultado recortado a nada. Este es un error clásico, acabo de abandonar el hábito de cometer este error con la cadena. Reemplazar :)
No tengo IDEA en funcionamiento, pero esto debería hacer el trabajo (a menos que esté equivocado):
var result = from each in listFromSplit select each.Trim();
Divide en espacios y comas y elimina las entradas vacías. Todo bien y recortado. Sin embargo, se supone que sus cadenas no contienen espacios.
List<string> listFromSplit =
new List<string>( "a , b ".Split( new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries ));
Las opciones linq que otros han proporcionado deberían funcionar bien. Como otra opción, aquí hay un método de extensión que usa 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();
}