C # / Linq: Anwenden einer Zuordnungsfunktion auf jedes Element in einer IEnumerable?

107

Ich habe nach einer Möglichkeit gesucht, jedes Element eines IEnumerable mithilfe einer Zuordnungsfunktion (auf Linq-kompatible Weise) in etwas anderes umzuwandeln, aber ich habe nichts gefunden.

Für ein (sehr einfaches) Beispiel sollte es in der Lage sein, so etwas zu tun

IEnumerable<int> integers = new List<int>() { 1, 2, 3, 4, 5 };
IEnumerable<string> strings = integers.Transform(i => i.ToString());

Aber ich habe nichts gefunden. Ich meine, es ist ziemlich einfach, eine Erweiterungsmethode zu schreiben, die dies erreicht (im Grunde ist es nur erforderlich, den Quell-Enumerator in eine neue Klasse zu packen und dann ein bisschen Boilerplate-Code zu schreiben, um die Aufrufe an ihn zu delegieren), aber ich hätte es erwartet Dies ist eine ziemlich elementare Operation, und das Schreiben selbst fühlt sich an, als würde man das Rad neu erfinden. Ich kann das Gefühl nicht loswerden, dass es eine eingebaute Methode gibt, die ich verwenden sollte, und ich war einfach zu blind, um sie zu sehen es.

Also ... gibt es etwas in Linq, das es mir ermöglicht, das zu tun, was ich oben beschrieben habe?

Andreas Baus
quelle

Antworten:

172

Sie können einfach die Select()Erweiterungsmethode verwenden:

IEnumerable<int> integers = new List<int>() { 1, 2, 3, 4, 5 };
IEnumerable<string> strings = integers.Select(i => i.ToString());

Oder in LINQ-Syntax:

IEnumerable<int> integers = new List<int>() { 1, 2, 3, 4, 5 };

var strings = from i in integers
              select i.ToString();
George Duckett
quelle
4
Ah! Ich wusste, dass es einen Weg geben musste. Ein bisschen vom alten "Forest / Trees Visual Occlusion Problem", denke ich :)
Andreas Baus
2
Beachten Sie, dass bei Problemen mit Ihrer Karte Probleme auftreten können, da der Hauptteil der Karte Select()erst ausgeführt wird, wenn sie aufgelistet ist. Das ist zwar keine gute Idee, aber es kann Situationen geben, in denen Sie möglicherweise etwas hinzufügen müssen, um ToList()die Auswertung der gesamten Liste zu erzwingen.
Dave Nichol
6
Ist es nicht korrekter, das eine Formular als "Linq-Abfragesyntax" und das andere Formular als "Linq-Methodensyntax" zu bezeichnen?
Ryan Harmuth
2
Tatsächlich sind beide Linq-Syntaxtypen, der erste heißt Methodensyntax und der zweite heißt Abfragesyntax. Lesen Sie mehr: docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
Machado
27

Sie suchen nach Selectdem, mit dem Sie die Eingabesequenz transformieren \ projizieren können:

IEnumerable<string> strings = integers.Select(i => i.ToString());
Tim Lloyd
quelle
9
Um fair zu sein, sollte es mit SQL übereinstimmen (wobei die letzteren Begriffe eine gebräuchliche Terminologie sind)
Eclairevoyant
5
Es ist ziemlich nervig. Ich versuche, funktionale Programmierung zu lernen ... muss aber 10 Jahre LINQ-Begriffe verlernen. Ich brauche einen Übersetzungsleitfaden. Ich frage mich, ob Google Übersetzer helfen könnte ...
Damien Sawyer