C # / Linq: применить функцию сопоставления к каждому элементу в IEnumerable?

111

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

Для (очень простого) примера он должен уметь делать что-то вроде

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

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

Итак ... есть ли в Linq что-то, что позволяет мне делать то, что я описал выше?

Андреас Баус
источник

Ответы:

178

Вы можете просто использовать 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()чтобы заставить его оценить весь список.
Dave Nichol
6
Разве не правильнее называть одну форму «синтаксисом запроса linq», а другую - «синтаксисом метода linq»?
Райан Хармут,
2
На самом деле оба являются типами синтаксиса Linq, первый называется синтаксисом метода, а второй - синтаксисом запроса. Подробнее: docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
Machado
28

Вы ищете, Selectчто можно использовать для преобразования \ проецирования входной последовательности:

IEnumerable<string> strings = integers.Select(i => i.ToString());
Тим Ллойд
источник
9
Честно говоря, он должен соответствовать SQL (где последний набор терминов является общей терминологией)
éclairevoyant
5
Это очень раздражает. Я пытаюсь изучить функциональное программирование ... но мне нужно отучиться от 10 лет использования терминов LINQ. Мне нужно руководство по переводу. Интересно, что Google Translate может помочь ...
Дэмиен Сойер