Select und Projektion
Formen Sie Daten in neue Strukturen um.
Select und Projektion ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Was Projektion bedeutet
Select wandelt jedes Element einer Sequenz in eine neue Form um. Dies wird als Projektion bezeichnet.
Der Operator nimmt ein Lambda entgegen, das ein Element auf ein Ergebnis abbildet, und gibt eine Sequenz dieser Ergebnisse zurück – die Quelle bleibt unverändert.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4 };
var squares = nums.Select(n => n * n);
Console.WriteLine(string.Join(", ", squares));Den Typ ändern
Eine Projektion kann den Elementtyp vollständig ändern. Die Abbildung von int auf string ergibt ein IEnumerable<string>.
Der Ausgabetyp wird aus dem Rückgabetyp des Lambdas abgeleitet, sodass der Compiler ihn für Sie verfolgt.
using System;
using System.Linq;
int[] nums = { 10, 20, 30 };
var labels = nums.Select(n => $"Item #{n}");
foreach (var l in labels) Console.WriteLine(l);Eigenschaften projizieren
Eine häufige Anwendung besteht darin, eine einzelne Eigenschaft aus Objekten herauszuziehen. Select(p => p.Name) wandelt eine Liste von Objekten in eine Liste von Namen um.
So reduzieren Sie die Daten vor der weiteren Verarbeitung oder Anzeige auf das, was Sie tatsächlich benötigen.
using System;
using System.Linq;
using System.Collections.Generic;
record User(string Name, int Age);
var users = new List<User> { new("Ana", 30), new("Bo", 25) };
var names = users.Select(u => u.Name);
Console.WriteLine(string.Join(", ", names));Ergebnisse mit anonymem Typ
Sie können in einen anonymen Typ projizieren, um mehrere Felder zusammenzuhalten. Verwenden Sie dazu new { ... } innerhalb des Lambdas.
Der Compiler erzeugt im Hintergrund eine Klasse mit schreibgeschützten Eigenschaften. Das ist ideal zum Formen von Zwischenergebnissen.
using System;
using System.Linq;
using System.Collections.Generic;
record User(string Name, int Age);
var users = new List<User> { new("Ana", 30), new("Bo", 25) };
var shaped = users.Select(u => new { u.Name, IsAdult = u.Age >= 18 });
foreach (var s in shaped) Console.WriteLine($"{s.Name}:{s.IsAdult}");Select mit Index
Wie Where besitzt auch Select eine Überladung, die den nullbasierten Index bereitstellt. Das Lambda nimmt (element, index) entgegen.
Das eignet sich hervorragend zum Nummerieren von Elementen oder um jeden Wert mit seiner Position zu verknüpfen.
using System;
using System.Linq;
string[] tasks = { "Wake", "Eat", "Code" };
var numbered = tasks.Select((t, i) => $"{i + 1}. {t}");
foreach (var n in numbered) Console.WriteLine(n);Select in der Abfragesyntax
In der Abfragesyntax führt die select-Klausel die Projektion aus. Sie können das Element selbst oder einen beliebigen darauf basierenden Ausdruck auswählen.
Kombinieren Sie select mit where, um in einer übersichtlichen Abfrage zu filtern und die Form der Daten anzupassen.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4, 5 };
var result = from n in nums
where n % 2 == 1
select n * 10;
Console.WriteLine(string.Join(", ", result));SelectMany flacht ab
Wenn jedes Element auf eine Sammlung abgebildet wird, würde Select eine Sequenz von Sequenzen ergeben. SelectMany flacht diese zu einer einzigen Sequenz ab.
Das entspricht in LINQ einer verschachtelten Schleife, die die inneren Ergebnisse aneinanderhängt.
using System;
using System.Linq;
using System.Collections.Generic;
var groups = new List<int[]> { new[] {1, 2}, new[] {3, 4} };
var flat = groups.SelectMany(g => g);
Console.WriteLine(string.Join(", ", flat));Auch Projektion wird verzögert ausgeführt
Select verwendet ebenfalls das Modell der verzögerten Ausführung. Das Abbildungs-Lambda wird erst ausgeführt, wenn die Sequenz aufgezählt wird.
Das Erstellen einer Projektion ist daher kostengünstig; die eigentliche Arbeit erfolgt beim Durchlaufen oder Materialisieren des Ergebnisses.
using System;
using System.Linq;
int runs = 0;
int[] nums = { 1, 2, 3 };
var q = nums.Select(n => { runs++; return n; });
Console.WriteLine($"Before: {runs}");
foreach (var _ in q) { }
Console.WriteLine($"After: {runs}");Erst filtern, dann projizieren
Die Reihenfolge ist für Klarheit und Effizienz wichtig: Filtern Sie zuerst mit Where und projizieren Sie anschließend mit Select, damit Sie nur die behaltenen Elemente umwandeln.
Diese Pipeline liest sich von oben nach unten und vermeidet unnötige Projektionsarbeit.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4, 5, 6 };
var result = nums.Where(n => n % 2 == 0)
.Select(n => n * n);
Console.WriteLine(string.Join(", ", result));In einen neuen Record projizieren
Statt anonymer Typen können Sie in einen benannten Typ oder record projizieren. Das ist nützlich, wenn Ergebnisse Methodengrenzen überschreiten, da anonyme Typen nicht unter einem bekannten Namen zurückgegeben werden können.
Auf diese Weise werden auch DTOs aus umfangreicheren Domänenobjekten erstellt.
using System;
using System.Linq;
using System.Collections.Generic;
record User(string Name, int Age);
record Summary(string Name);
var users = new List<User> { new("Ana", 30) };
var dtos = users.Select(u => new Summary(u.Name));
foreach (var d in dtos) Console.WriteLine(d.Name);Select bewahrt Reihenfolge und Anzahl
Im Gegensatz zu Where fügt Select niemals Elemente hinzu oder entfernt sie – die Abbildung erfolgt eins zu eins. Ausgabe und Eingabe haben dieselbe Anzahl und Reihenfolge der Elemente.
Wenn Sie weniger Elemente benötigen, filtern Sie; wenn Sie aus jedem Element mehrere erzeugen möchten, verwenden Sie SelectMany.
using System;
using System.Linq;
int[] nums = { 5, 1, 9 };
var doubled = nums.Select(n => n * 2);
Console.WriteLine($"In:{nums.Length} Out:{doubled.Count()}");Kurzer Test
Wählen Sie den passenden Operator für die jeweilige Aufgabe.
Zusammenfassung
Select projiziert jedes Element in eine neue Form – eine Eigenschaft, eine Zeichenfolge, einen anonymen Typ oder einen Record – und bewahrt dabei Anzahl und Reihenfolge eins zu eins. Der Operator besitzt eine Überladung mit Index und wird verzögert ausgeführt.
SelectMany flacht verschachtelte Sequenzen ab. Als Nächstes sortieren und gruppieren wir die geformten Daten.
Häufig gestellte Fragen
Ist die Lektion „Select und Projektion“ kostenlos?
Ja — der vollständige Text von „Select und Projektion“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Select und Projektion“?
Formen Sie Daten in neue Strukturen um. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C# Academy zu starten?
Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „Select und Projektion“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?
Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Where und Filtern
- Select und Projektion
- OrderBy und Gruppierung
- Aggregationen und ToList