c# - validar - ¿Cómo convertir todas las cadenas en List<string> a minúsculas usando LINQ?
tolower c# (5)
Ayer vi un fragmento de código en una de las respuestas aquí en StackOverflow que me intrigó. Fue algo como esto:
List<string> myList = new List<string> {"aBc", "HELLO", "GoodBye"};
myList.ForEach(d=>d.ToLower());
Esperaba poder usarlo para convertir todos los elementos en myList a minúsculas. Sin embargo, no sucede ... después de ejecutar esto, la carcasa de myList no ha cambiado.
Entonces mi pregunta es si HAY una forma, usando expresiones LINQ y Lambda para iterar fácilmente y modificar el contenido de una lista de una manera similar a esto.
Gracias, Max
El enfoque más fácil:
myList = myList.ConvertAll(d => d.ToLower());
No demasiado diferente de tu código de ejemplo. ForEach
bucle en la lista original, mientras que ConvertAll
crea uno nuevo que debe reasignar.
Eso es porque ToLower devuelve una cadena en minúscula en lugar de convertir la cadena original. Entonces querrías algo como esto:
List<string> lowerCase = myList.Select(x => x.ToLower()).ToList();
ForEach
uso de Action<T>
, lo que significa que podría afectar a x
si no fuera inmutable. Como x
es una string
, es inmutable, por lo que nada de lo que hagas en la lambda cambiará sus propiedades. La solución de Kyralessa es su mejor opción a menos que desee implementar su propio método de extensión que le permita devolver un valor de reemplazo.
[TestMethod]
public void LinqStringTest()
{
List<string> myList = new List<string> { "aBc", "HELLO", "GoodBye" };
myList = (from s in myList select s.ToLower()).ToList();
Assert.AreEqual(myList[0], "abc");
Assert.AreEqual(myList[1], "hello");
Assert.AreEqual(myList[2], "goodbye");
}
var _reps = new List(); // with variant data
_reps.ConvertAll<string>(new Converter<string,string>(delegate(string str){str = str.ToLower(); return str;})).Contains("invisible"))