Пример array.map() в С#?
Рассмотрим следующую общую конструкцию JavaScript
var ages = people.map(person => person.age);
Предоставление желаемого результата, который представляет собой массив возрастов.
Что эквивалентно этому в С#? Пожалуйста, включите простой пример. Документация указывает select
или возможный selectAll
, но я не могу найти пример онлайн или любой другой вопрос SO, который может быть вставлен и работает.
Если возможно, приведи пример, который превращает следующий массив {1,2,3,4}
в следующий {'1a','2a','3a','4a'}
. Для каждого элемента добавьте "a" в конец, превратив его из целого в строку.
Ответы
Ответ 1
Это называется проекцией, которая называется Select
в LINQ. Это не возвращает новый массив (например, как работает JavaScript .map
), но IEnumerable<T>
. Вы можете преобразовать его в массив с .ToArray
.
var ages = people.Select(person => person.Age).ToArray();
Select
работает со всеми IEnumerable<T>
, которые реализуют массивы. Вам просто нужны .NET 3.5 и оператор using System.Linq;
.
Для вашего второго примера используйте что-то вроде этого. Обратите внимание, что в использовании нет массивов - только последовательности.
var items = Enumerable.Range(1, 4).Select(num => string.Format("{0}a", num));
Ответ 2
Только для информации, если people
является List<Person>
, метод ConvertAll
очень похож на JS map
, например:
var ages = people.ConvertAll<int>(person => person.age);
Но если у вас есть массив и вы хотите использовать любые методы List<T>
, вы можете легко достичь этого, преобразовывая переменную в список из массива, например:
var ages = people.ToList().ConvertAll<int>(person => person.age);
И, наконец, если вам действительно нужен массив, вы можете его вернуть, например:
var ages = people.ToList().ConvertAll<int>(person => person.age).ToArray();
Но этот последний пример не так хорош, как другие ответы, и вы должны использовать Select
, если работаете только с массивами. Но если вы можете, я предлагаю вам перейти на List<T>
, это намного лучше!
Ответ 3
Linq .Select
- эквивалент map
, а .Aggregate
- эквивалент fold
.
var nums = new[] {1,2,3,4};
string[] r = nums.Select(x => x + "a").ToArray();
Ответ 4
Методы расширения LINQ в коллекциях дают вам множество действительно полезных утилит. Select
является одним из них:
int[] arr = { 1, 2, 3 };
IEnumerable<string> list = arr.Select(el => el + "a");
string[] arr2 = list.ToArray();
foreach (var str in arr2)
Console.Write(str + " ");
Это должно выводить:
1a 2a 3a
Это можно безопасно конденсировать до 1-лайнера:
string[] arr2 = arr.Select(el => el + "a").ToArray();
Рабочий пример:
https://ideone.com/mxxvfy
Связанные документы:
Перечислить. Выбрать
Основные операции запроса LINQ (С#)