C # / Linq: Zastosuj funkcję mapowania do każdego elementu w IEnumerable?

107

Szukałem sposobu na przekształcenie każdego elementu IEnumerable w coś innego za pomocą funkcji mapowania (w sposób zgodny z Linq), ale nic nie znalazłem.

Na (bardzo prosty) przykład powinien 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 nic nie znalazłem. Chodzi mi o to, że napisanie metody rozszerzającej, która to osiąga (w zasadzie wszystko, czego wymaga, to zawinięcie modułu wyliczającego źródła do nowej klasy, a następnie napisanie trochę standardowego kodu do delegowania wywołań do niego), ale spodziewałbym się to jest dość elementarna operacja, a pisanie jej samemu czuje się jak wynalezienie koła na nowo - nie mogę pozbyć się wrażenia, że ​​może istnieć wbudowany sposób, którego powinienem użyć, a po prostu byłem zbyt ślepy, aby zobaczyć to.

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

Andreas Baus
źródło
1
Prawdopodobnie powiązane: Jaki jest C # odpowiednik funkcji map w Haskell .

Odpowiedzi:

172

Możesz po prostu użyć Select()metody rozszerzenia:

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

Lub w składni LINQ:

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

var strings = from i in integers
              select i.ToString();
George Duckett
źródło
4
Ach! Wiedziałem, że musi być sposób. Wydaje mi się, że trochę starego "Problemu okluzji wizualnej lasu / drzew" :)
Andreas Baus,
2
Pamiętaj, że jeśli twoja mapa ma efekty uboczne, możesz napotkać kłopoty, ponieważ treść Select()nie będzie musiała zostać wykonana, dopóki nie zostanie wyliczona. Nie jest to świetny pomysł, ale mogą wystąpić sytuacje, w których konieczne może być dodanie, ToList()aby wymusić ocenę całej listy.
Dave Nichol
6
Czy nie jest bardziej poprawne nazywanie jednego formularza „składnią zapytania linq”, a drugiego „składnią metody linq”?
Ryan Harmuth
2
Właściwie oba są typami składni Linq, pierwszy nazywa się Składnia metody, a drugi Składnia zapytania. Czytaj więcej: docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
Machado,
27

Szukasz tego, Selectczego można użyć do przekształcenia \ zaprojektowania sekwencji wejściowej:

IEnumerable<string> strings = integers.Select(i => i.ToString());
Tim Lloyd
źródło
9
Aby być uczciwym, ma pasować do SQL (gdzie drugi zestaw terminów jest powszechną terminologią)
éclairevoyant
5
To dość denerwujące. Próbuję nauczyć się programowania funkcjonalnego ... ale muszę oduczyć się 10 lat terminów LINQ. Potrzebuję przewodnika po tłumaczeniach. Zastanawiam się, czy tłumacz Google mógłby pomóc ...
Damien Sawyer