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?


1

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();

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());

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.