2011-08-25 12 views
65

Szukałem sposobu na przekształcenie każdego elementu IEnumerable w coś innego za pomocą funkcji mapowania (w sposób zgodny z Linq), ale nie znalazłem nic.C#/Linq: Zastosuj funkcję mapowania do każdego elementu w IEnumerable?

Dla (bardzo prosty) przykład, powinien on być w stanie zrobić coś takiego

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

Ale nie znalazłem nic. Chodzi mi o to, że napisanie metody rozszerzenia, która to umożliwia (wystarczy, że wszystko, czego wymaga to zawinięcie modułu kodującego źródłowego do nowej klasy, a następnie napisanie fragmentu kodu standardowego do delegowania wywołań) jest całkiem proste, ale oczekiwałbym jest to dość elementarna operacja, a samo jej napisanie wydaje się być jak ponowne wymyślenie koła - nie mogę otrząsnąć się z poczucia, że ​​może istnieć wbudowany sposób, z którego powinienem korzystać, a ja po prostu byłem zbyt ślepy, by widzieć to.

Więc ... jest coś w Linq, które pozwala mi zrobić to, co opisałem powyżej?

+3

jak o "." Wybrać " –

+0

Prawdopodobnie dotyczą d: [Jaki jest odpowiednik funkcji mapy w Haskell'u w C#] (http://stackoverflow.com/q/2142935/456814). –

Odpowiedz

101

można po prostu użyć metody Select() rozszerzenia:

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

albo w składni LINQ:

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

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

Ah! Wiedziałem, że musi być jakiś sposób. Trochę starego "Problemu okluzji wzrokowo-leśnej", chyba :) –

+1

Pamiętaj, że jeśli twoja mapa ma efekty uboczne, możesz wpaść w kłopoty, ponieważ ciało 'Select()' niekoniecznie zostanie wykonane dopóki nie zostanie wyliczona. Nie jest to świetny pomysł, aby to zrobić, ale mogą istnieć sytuacje, w których może być konieczne dodanie 'ToList()', aby wymusić ocenę całej listy. –

+4

Czy nie jest bardziej poprawne wywoływanie jednego formularza "składnia zapytania linq", a druga forma "składnia metody linq"? –

18

Szukacie Select które mogą być wykorzystane do przekształcenia \ Project sekwencji wejściowej:

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

MS nigdy nie natknął się na termin, który wymyka się z przymusu zmiany nazwy. To choroba. Nie mapuj, filtruj, spasuj lub zmniejszaj, ale możesz wybrać, zsumować ... –

+3

Aby być sprawiedliwym, powinien on pasować do SQL (gdzie ostatni zestaw terminów jest powszechną terminologią) – luolimao

Powiązane problemy