2015-10-05 3 views
19

Рассмотрим следующий общий JavaScript построитьПример array.map() в C#?

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

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

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

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

+0

Определенно что-то с linq – Elipzer

+1

'(new [] {1,2,3,4}). Выберите (v => String.Format (" {0} a ", v))' –

+0

@AlexeiLevenkov Вы пропустили '.ToArray()' в конце. – Corey

ответ

40

Это называется проекцией, которая называется 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)); 
+0

Вам не нужно передавать 'num' в' string.Format'? –

+0

Обновление @RichardSchneider. –

+0

на C# 6: 'var items = Enumerable.Range (1, 4) .Выберите (num => string.Format ($" {num} a "));' –

1

Linq-х .Select является map эквивалента и .Aggregate является fold эквивалентом.

var nums = new[] {1,2,3,4}; 
string[] r = nums.Select(x => x + "a").ToArray(); 
1

Методы расширения 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

Связанные документы:

Enumerable.Select

Basic LINQ Query Operations (C#)

+0

Как это отличается от ответа @Richard Schneider. Также, что нужно делать ToList() ?? –

5

только для информации, если 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>, это намного лучше!

Смежные вопросы