2008-10-23 11 views
73

Vi un fragmento de código ayer en una de las respuestas aquí en StackOverflow que me intrigó. Era algo como esto:Cómo convertir todas las cadenas en la lista <string> a minúsculas usando LINQ?

List<string> myList = new List<string> {"aBc", "HELLO", "GoodBye"}; 

myList.ForEach(d=>d.ToLower()); 

Tenía la esperanza de que pudiera utilizarlo para convertir todos los artículos en miLista a minúsculas. Sin embargo, no sucede ... después de ejecutar esto, la carcasa de myList no ha cambiado.

Así que mi pregunta es si HAY una forma, usando expresiones LINQ y Lambda para iterar fácilmente y modificar los contenidos de una lista de una manera similar a esto.

Gracias, Max

Respuesta

131

método más sencillo:

myList = myList.ConvertAll(d => d.ToLower()); 

No demasiado diferente a su código de ejemplo. ForEach ejecuta la lista original mientras que ConvertAll crea una nueva que debe reasignar.

+4

No es un método de extensión. – leppie

+0

@leppie: Es cierto, no es - buena captura. En este caso, preocuparse por si se trata de un método de instancia o un método de extensión puede ser un poco pedante, pero definitivamente es preciso. :) –

+0

Y la cuerda es inmutable: P – Sherlock

3
[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"); 
} 
34

Eso es porque ToLower vuelve una cadena en minúsculas en lugar de convertir la cadena original. Así que te gustaría algo como esto:

List<string> lowerCase = myList.Select(x => x.ToLower()).ToList(); 
+1

me gusta este enfoque mejor que la respuesta aceptada porque se puede usar esto con cualquier IEnumerable , no sólo Lista . –

+5

Esta solución también funciona en .NET Core, ConvertAll no existe en .NET Core. –

3

ForEach utiliza Action<T>, lo que significa que podría afectar x si no fuera inmutable. Como x es 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.

+0

Investigue más si no está seguro ... ¿recuerda algo? –

+0

El error es humano, el enlace que proporcioné tenía 3.5 en negrita y 2.0 en la normal, no lo he visto. He borrado mi publicación ... un simple comentario tuyo habría sido suficiente. Desea rechazar por ninguna razón, que ahora suponga. –

+0

Aunque escribo esto casi un año después, y aunque no soy Daok, le diré por qué su respuesta es "incorrecta": usted dijo "la solución de Kyralessa es su mejor opción" cuando no es así: mi solución es más limpia y más claro. –

-1
var _reps = new List(); // with variant data 

_reps.ConvertAll<string>(new Converter<string,string>(delegate(string str){str = str.ToLower(); return str;})).Contains("invisible")) 
Cuestiones relacionadas