2011-08-25 26 views
65

He estado buscando una manera de transformar cada elemento de un IEnumerable en otra cosa utilizando una función de mapeo (de una manera compatible con LINQ) pero no he encontrado nada.C#/Linq: ¿Aplicar una función de mapeo a cada elemento en un IEnumerable?

Para un ejemplo (muy simple), que debería ser capaz de 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. Es decir, es bastante sencillo para escribir un método de extensión que logra que (básicamente, todo lo que requiere es envolver el empadronador de origen a una nueva clase y luego escribir un poco de código reutilizable para la delegación de las llamadas a la misma), pero yo hubiera esperado esto es una operación bastante elemental, y escribir yo mismo se siente como reinventar la rueda - no puedo evitar la sensación de que puede haber una manera integrada en la que debo utilizar, y yo sólo he estado demasiado ciego para ver eso.

Así que ... ¿hay algo en LINQ que me permite hacer lo que he descrito anteriormente?

+3

¿qué tal '.Select' –

+0

Posiblemente se relacionan d: [¿Cuál es el equivalente de C# de la función de mapa en Haskell] (http://stackoverflow.com/q/2142935/456814). –

Respuesta

101

sólo puede utilizar el método Select() extensión:

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

O en la sintaxis de LINQ:

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

var strings = from i in integers 
       select i.ToString(); 
+4

Ah! Sabía que tenía que haber una forma. Un poco de la "Visual Oclusión Problema Bosque/árboles" viejo, supongo :) –

+1

Tenga en cuenta que si su mapa tiene efectos secundarios que puede tener problemas ya que el cuerpo de 'Select()' no necesariamente va a ser ejecutado hasta que esté enumerado. No es una buena idea hacerlo, pero puede haber algunas situaciones en las que necesite agregar 'ToList()' para forzarlo a evaluar toda la lista. –

+4

¿No es más correcto llamar a la forma 'sintaxis de consulta de linq' y la otra a 'sintaxis de método de linq'? –

18

Usted está buscando Select que puede ser utilizado para transformar \ proyecto de la secuencia de entrada:

IEnumerable<string> strings = integers.Select(i => i.ToString()); 
+8

MS nunca ha encontrado un término que escapa a su obligación de cambiar el nombre. Es una enfermedad. No hay ningún mapa, filtro, doblar o reducir pero se puede seleccionar, agregar ... –

+3

Para ser justos se supone que debe coincidir con SQL (donde el último conjunto de términos son terminología común) – luolimao

Cuestiones relacionadas