Beispiel für array.map () in C #?

78

Betrachten Sie das folgende allgemeine JavaScript-Konstrukt

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

Geben Sie das gewünschte Ergebnis, das eine Reihe von Altersgruppen ist.

Was ist das Äquivalent dazu in C # ? Bitte fügen Sie ein einfaches Beispiel bei. Die Dokumentation zeigt selectoder ist möglich, selectAllaber ich kann kein Beispiel online oder eine andere SO-Frage finden, die eingefügt werden kann und funktioniert.

Wenn möglich, geben Sie ein Beispiel an, das das folgende Array {1,2,3,4}in das folgende verwandelt {'1a','2a','3a','4a'}. Fügen Sie für jedes Element "a" an das Ende an und verwandeln Sie es von einer Ganzzahl in eine Zeichenfolge.

Code Whisperer
quelle
1
(new[]{1,2,3,4}).Select(v => String.Format("{0}a", v))
Alexei Levenkov
1
@AlexeiLevenkov Du hast das .ToArray()am Ende verpasst .
Corey

Antworten:

117

Dies wird als Projektion bezeichnet, die Selectin LINQ aufgerufen wird . Das gibt kein neues Array zurück (wie es JavaScript .maptut), sondern ein IEnumerable<T>. Sie können es mit in ein Array konvertieren .ToArray.

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

Selectfunktioniert mit allen IEnumerable<T>Arrays, die implementiert werden. Sie benötigen lediglich .NET 3.5 und eine using System.Linq;Anweisung.

Verwenden Sie für Ihr zweites Beispiel so etwas. Beachten Sie, dass keine Arrays verwendet werden - nur Sequenzen.

 var items = Enumerable.Range(1, 4).Select(num => string.Format("{0}a", num));
Daniel A. White
quelle
auf c # 6:var items = Enumerable.Range(1, 4).Select(num => string.Format($"{num}a"));
Bart Calixto
17

Nur zur Information, wenn peoplees sich um eine handelt List<Person>, ist die ConvertAllMethode der von JS ziemlich ähnlich map, z.

var ages = people.ConvertAll<int>(person => person.age);

Wenn Sie jedoch ein Array haben und List<T>Methoden verwenden möchten , können Sie dies leicht erreichen, indem Sie Ihre Variable aus dem Array in eine Liste konvertieren, z.

var ages = people.ToList().ConvertAll<int>(person => person.age);

Und schließlich, wenn Sie wirklich ein Array zurück benötigen, können Sie es zurückkonvertieren, z.

var ages = people.ToList().ConvertAll<int>(person => person.age).ToArray();

Das letzte Beispiel ist jedoch nicht so gut wie die anderen Antworten, und Sie sollten es verwenden, Selectwenn Sie nur mit Arrays arbeiten. Aber wenn du kannst, schlage ich vor, dass du umziehst List<T>, es ist viel besser!

Buzinas
quelle
In Liste konvertieren und ConvertAll verwenden, damit ich meinen großen Select-Code umgestalten kann, der keinen Parameterkonstruktor in Linq
V-SHY
5

Die LINQ-Erweiterungsmethoden für Sammlungen bieten Ihnen eine Vielzahl nützlicher Dienstprogramme. SelectIst einer von ihnen:

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 + " ");

Dies sollte Folgendes ausgeben:

1a 2a 3a

Dies kann sicher zu einem 1-Liner verdichtet werden:

string[] arr2 = arr.Select(el => el + "a").ToArray();

Ein Arbeitsbeispiel:

https://ideone.com/mxxvfy

Verwandte Dokumente:

Enumerable.Select

Grundlegende LINQ-Abfrageoperationen (C #)

pb2q
quelle
Wie unterscheidet sich das von der Antwort von @Richard Schneider? Auch was ist die Notwendigkeit, ToList () zu tun?
Prashanth Thurairatnam
1

Linqs .Selectist das mapÄquivalent und .Aggregateist das foldÄquivalent.

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

Sie können die Schlüsselwörter verwenden from, select, inund while;
Oder für Ihr Beispiel:

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

Die Syntax wäre also im Wesentlichen:

 <<list-output>> = (from <<var-name>> in <<list-input>> select <<operation>>);
Merlin
quelle