C # / Linq: applicare una funzione di mappatura a ogni elemento in un oggetto IEnumerable?


107

Stavo cercando un modo per trasformare ogni elemento di un IEnumerable in qualcos'altro utilizzando una funzione di mappatura (in un modo compatibile con Linq) ma non ho trovato nulla.

Per un esempio (molto semplice), dovrebbe essere in grado di fare qualcosa come

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

Ma non ho trovato niente. Voglio dire, è abbastanza semplice scrivere un metodo di estensione che lo faccia (in pratica, tutto ciò che richiede è avvolgere l'enumeratore di origine in una nuova classe e quindi scrivere un po 'di codice boilerplate per delegare le chiamate ad esso), ma mi sarei aspettato questa è un'operazione abbastanza elementare, e scriverla io stesso sembra come reinventare la ruota - non riesco a scrollarmi di dosso la sensazione che potrebbe esserci un modo integrato che dovrei usare, e sono stato troppo cieco per vedere esso.

Quindi ... c'è qualcosa in Linq che mi permette di fare ciò che ho descritto sopra?


Risposte:


172

Puoi semplicemente usare il Select()metodo di estensione:

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

O nella sintassi LINQ:

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

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

4
Ah! Sapevo che doveva esserci un modo. Un po 'del vecchio "Problema di occlusione visiva foresta / alberi", immagino :)
Andreas Baus

2
Tieni presente che se la tua mappa ha effetti collaterali potresti incorrere in problemi poiché il corpo del file Select()non verrà necessariamente eseguito finché non viene enumerato. Non che sia una buona idea farlo, ma potrebbero esserci alcune situazioni in cui potrebbe essere necessario aggiungere ToList()per forzare la valutazione dell'intero elenco.
Dave Nichol

6
Non è più corretto chiamare la forma "sintassi della query linq" e l'altra forma "sintassi del metodo linq"?
Ryan Harmuth

2
In realtà entrambi sono tipi di sintassi Linq, il primo è chiamato sintassi del metodo e il secondo è chiamato sintassi della query. Per saperne di più: docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
Machado

27

Stai cercando Selectquale può essere utilizzato per trasformare \ project la sequenza di input:

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

9
Per essere onesti, dovrebbe corrispondere a SQL (dove quest'ultimo insieme di termini è una terminologia comune)
éclairevoyant

5
È piuttosto fastidioso. Sto cercando di imparare la programmazione funzionale ... ma devo disimparare 10 anni di termini LINQ. Ho bisogno di una guida alla traduzione. Mi chiedo che la traduzione di Google possa aiutare ...
Damien Sawyer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.