C # / Linq: ¿Aplicar una función de mapeo a cada elemento en un IEnumerable?

107

He estado buscando una forma de transformar cada elemento de un IEnumerable en otra cosa usando una función de mapeo (de una manera compatible con Linq) pero no he encontrado nada.

Para un ejemplo (muy simple), debería poder hacer algo como

IEnumerable<int> integers = new List<int>() { 1, 2, 3, 4, 5 };
IEnumerable<string> strings = integers.Transform(i => i.ToString());

Pero no he encontrado nada. Quiero decir, es bastante sencillo escribir un método de extensión que lo haga (básicamente, todo lo que requiere es envolver el enumerador de origen en una nueva clase y luego escribir un poco de código repetitivo para delegar las llamadas), pero habría esperado Esta es una operación bastante elemental, y escribirla yo mismo se siente como reinventar la rueda: no puedo evitar la sensación de que puede haber una forma incorporada que debería usar, y he estado demasiado ciego para ver eso.

Entonces ... ¿hay algo en Linq que me permita hacer lo que describí anteriormente?

Andreas Baus
fuente

Respuestas:

172

Puedes usar el Select()método de extensión:

IEnumerable<int> integers = new List<int>() { 1, 2, 3, 4, 5 };
IEnumerable<string> strings = integers.Select(i => i.ToString());

O en sintaxis LINQ:

IEnumerable<int> integers = new List<int>() { 1, 2, 3, 4, 5 };

var strings = from i in integers
              select i.ToString();
George Duckett
fuente
4
¡Ah! Sabía que tenía que haber una forma. Un poco del viejo "Problema de oclusión visual de bosques / árboles", supongo :)
Andreas Baus
2
Tenga en cuenta que si su mapa tiene efectos secundarios, puede tener problemas, ya que el cuerpo del mapa Select()no se ejecutará necesariamente hasta que se enumere. No es que sea una gran idea hacer eso, pero puede haber algunas situaciones en las que deba agregar ToList()para obligarlo a evaluar la lista completa.
Dave Nichol
6
¿No es más correcto llamar a una forma 'sintaxis de consulta linq' y la otra forma 'sintaxis de método linq'?
Ryan Harmuth
2
En realidad, ambos son tipos de sintaxis Linq, el primero se llama sintaxis de método y el segundo se llama sintaxis de consulta. Leer más: docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
Machado
27

Está buscando Selectcuál se puede usar para transformar \ proyectar la secuencia de entrada:

IEnumerable<string> strings = integers.Select(i => i.ToString());
Tim Lloyd
fuente
9
Para ser justos, se supone que debe coincidir con SQL (donde el último conjunto de términos son terminología común)
éclairevoyant
5
Es bastante molesto. Estoy tratando de aprender programación funcional ... pero tengo que desaprender 10 años de términos LINQ. Necesito una guía de traducción. Me pregunto si el traductor de Google podría ayudar ...
Damien Sawyer