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.