2009-12-30 6 views
5

que tienen una lista como:Expresión lambda cómo ejecutar String.Format en la lista <String>?

List<String> test = new List<String> {"Luke", "Leia"}; 

me gustaría usar algo como esto:

test.Select(s => String.Format("Hello {0}", s)); 

pero no se ajusta a los nombres de la lista. ¿Hay alguna forma de usar expresiones lambda para alterar esto? ¿O es porque las cadenas son inmutables que esto no funciona?

Respuesta

12

Select no modifica la colección original; se crea un nuevo IEnumerable <T> que se pueden enumerar con un foreacho convertir a una lista:

List<String> test2 = test.Select(s => String.Format("Hello {0}", s)).ToList(); 

prueba todavía contiene "Lucas" y "Leia" y test2 contiene "Hola Lucas" y "Hola, Leia".


Si desea modificar la lista original con una expresión lambda, se puede aplicar la expresión lambda a cada elemento de la lista de forma individual y almacenar el resultado de nuevo en la colección:

Func<string, string> f = s => String.Format("Hello {0}", s); 

for (int i = 0; i < test.Count; i++) 
{ 
    test[i] = f(test[i]); 
} 
+0

Gracias, el primero de ellos tuvo éxito para mí. –

+0

@Nyla Pareska: Esa versión no modifica la colección original que parecía ser su intención ("pero no ajusta los nombres en la lista"). Si desea hacerlo, consulte el método de extensión que proporcioné en mi respuesta. – jason

-2

sólo podría hacer una declaración foreach:

test.ForEach(s=>String.Format("Hello {0}", s)); 

Eso es si está tratando de actualizar los nombres.

+2

ForEach toma 'Action ' y no modifica 'List ' – dtb

+1

String.Format devuelve una nueva cadena, pero no modifica la cadena original. – M4N

+0

Ok, así que actualícelo como tal: s => s = String.Format ("Hola {0}", s)); Todo depende de lo que quería hacer de todos modos, devolver una nueva lista con valores actualizados o actualizar la lista original. –

3

aquí:

for(int i = 0; i < test.Count; i++) { 
    test[i] = String.Format("Hello {0}", test[i]); 
} 

No hay necesidad de ser de lujo. No es necesario abusar de LINQ. Solo mantenlo simple.

Usted podría ir un paso más allá y crear un método de extensión de este modo:

static class ListExtensions { 
    public static void AlterList<T>(this List<T> list, Func<T, T> selector) { 
     for(int index = 0; index < list.Count; index++) { 
      list[index] = selector(list[index]); 
     } 
    } 
} 

Uso:

test.AlterList(s => String.Format("Hello {0}", s)); 

Select es para proyectar y está destinado realmente para ser utilizado en circunstancias donde hay no hay efectos secundarios. La manipulación de los elementos en la lista muy claramente tiene efectos secundarios. De hecho, la línea

test.Select(s => String.Format("Hello {0}", s)); 

no hace nada más que la creación de un IEnumerable<string> que eventualmente podrían ser enumerados más para producir la proyección.

+1

No entiendo cómo estaría abusando de LINQ. Él lo usaría exactamente como estaba destinado a ser usado. Su pregunta también le preguntó específicamente cómo realizar la tarea usando una expresión lambda. –

+1

'Seleccionar' no está destinado a causar efectos secundarios. – jason

+0

@Downvoter: Por favor, deje un comentario sobre por qué votó negativamente. – jason

0

Otra solución posible:

List<String> test = new List<String> {"Luke", "Leia"}; 
List<string> FormattedStrings = new List<string>(); 
test.ForEach(testVal => FormattedStrings.Add(String.Format("Hello {0}", testVal))); 
Cuestiones relacionadas