Приклад array.map () у C #?


81

Розглянемо наступну поширену конструкцію JavaScript

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

Надання бажаного результату, який є масивом віків.

Що еквівалентно цьому в C # ? Будь ласка, наведіть простий приклад. Документація вказує selectабо можливо, selectAllале я не можу знайти приклад в Інтернеті чи будь-яке інше запитання щодо SO, яке можна вставити та працює.

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


1
(new[]{1,2,3,4}).Select(v => String.Format("{0}a", v))
Олексій Левенков

1
@AlexeiLevenkov Ви пропустили .ToArray()кінець.
Кори

Відповіді:


122

Це називається проекцією, яка називається Selectв LINQ. Це повертає не новий масив (наприклад, як це .mapробить JavaScript ), а файл IEnumerable<T>. Ви можете перетворити його на масив за допомогою .ToArray.

using System.Linq; // Make 'Select' extension available
...
var ages = people.Select(person => person.Age).ToArray();

Selectпрацює з усіма, IEnumerable<T>які реалізовані масиви. Вам просто потрібен .NET 3.5 і using System.Linq;виписка.

Для вашого 2-го прикладу використовуйте щось подібне. Зверніть увагу, що не використовуються масиви - лише послідовності.

 var items = Enumerable.Range(1, 4).Select(num => string.Format("{0}a", num));

на c # 6:var items = Enumerable.Range(1, 4).Select(num => string.Format($"{num}a"));
Барт Каліксто

18

Тільки для інформації, якщо peopleє a 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>, це набагато краще!


перетворити на List та використовувати ConvertAll дозволить мені переформатувати мій великий код Select, який не дозволяє мати конструктор параметрів у Linq
V-SHY

5

Методи розширення 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 (C #)


Чим це відрізняється від відповіді @Richard Schneider. Також що потрібно робити ToList () ??
Прашант Турайратнам

1

Linq's .Selectє mapеквівалентом і .Aggregateє foldеквівалентом.

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

1

Ви можете використовувати ключові слова from, select, inі while;
Або для вашого прикладу:

 var ages = (from person in people select person.age).ToArray();

Отже, по суті, синтаксис буде таким:

 <<list-output>> = (from <<var-name>> in <<list-input>> select <<operation>>);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.