Подтвердить что ты не робот

Пример array.map() в С#?

Рассмотрим следующую общую конструкцию JavaScript

var ages = people.map(person => person.age);

Предоставление желаемого результата, который представляет собой массив возрастов.

Что эквивалентно этому в С#? Пожалуйста, включите простой пример. Документация указывает select или возможный selectAll, но я не могу найти пример онлайн или любой другой вопрос SO, который может быть вставлен и работает.

Если возможно, приведи пример, который превращает следующий массив {1,2,3,4} в следующий {'1a','2a','3a','4a'}. Для каждого элемента добавьте "a" в конец, превратив его из целого в строку.

4b9b3361

Ответ 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 (С#)