C # / Linq: застосувати функцію відображення до кожного елемента в IEnumerable?


107

Я шукав спосіб перетворити кожен елемент IEnumerable в щось інше за допомогою функції відображення (по-сумісному з Linq), але нічого не знайшов.

Для (дуже простого) прикладу, він повинен вміти робити щось подібне

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

Але я нічого не знайшов. Я маю на увазі, досить просто написати метод розширення, який досягає цього (в основному, все, що потрібно, це перетворити джерело-перечислювач в новий клас, а потім написати трохи кодового коду для делегування викликів до нього), але я б очікував це досить елементарна операція, і писати це я відчуваю, як винаходити колесо - я не можу похитнути відчуття, що може бути вбудований спосіб, яким я повинен користуватися, і я просто був занадто сліпий, щоб побачити це.

Отже ... чи є щось у Linq, що дозволяє мені робити те, що я описав вище?


Відповіді:


172

Ви можете просто скористатися Select()методом розширення:

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

Або в синтаксисі LINQ:

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

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

4
Ах! Я знав, що повинен бути спосіб. Трохи старої "Проблеми візуального окуляції лісів / дерев", я думаю :)
Андреас Баус

2
Пам’ятайте, що якщо на вашій карті є побічні ефекти, ви можете зіткнутися з проблемою, оскільки тіло Select()не обов’язково буде виконуватися, поки воно не буде перераховано. Не те, що це чудово зробити, але можуть виникнути ситуації, коли вам потрібно буде додати, ToList()щоб змусити її оцінити весь список.
Дейв Нікол

6
Чи не правильніше називати одну форму "синтаксисом запиту linq", а іншу форму "синтаксисом методу linq"?
Райан Хармут

2
Насправді обидва типи синтаксису Linq, перший називається синтаксисом методу, а другий називається синтаксисом запиту. Детальніше: docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
Мачадо

27

Ви шукаєте, для Selectчого можна перетворити \ проектувати послідовність введення:

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

9
Для справедливості він повинен відповідати SQL (де останній набір термінів є загальною термінологією)
éclairevoyant

5
Це досить дратує. Я намагаюся навчитися функціональному програмуванню ... але мушу вивчити 10 років термінів LINQ. Мені потрібен посібник з перекладу. Цікаво, що переклад Google може допомогти ...
Демієн Сойєр
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.