Listen- und Tupel-Patterns
Destrukturieren Sie Collections.
Listen- und Tupel-Patterns ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 4 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.
Tupelmuster
Ein Tupelmuster gleicht mehrere Werte gleichzeitig ab, indem es sie in Klammern einschließt. Jede Position wird mit einem eigenen Teilmuster abgeglichen.
Das eignet sich ideal für Entscheidungen, die von mehreren Eingaben abhängen, etwa für eine kleine Zustandsmaschine oder eine Schiedsrichterlogik für Schere, Stein, Papier – alles in einem einzigen Switch.
int x = 0, y = 5;
string quadrant = (x, y) switch
{
(0, 0) => "origin",
(0, _) => "y-axis",
(_, 0) => "x-axis",
_ => "plane"
};
System.Console.WriteLine(quadrant);Ein ausführbarer Tupel-Switch
Tupelmuster machen Entscheidungstabellen übersichtlich. Hier bestimmen zwei boolesche Werte eine Aktion.
Jeder Zweig führt ein Tupelmuster auf. Der Discard _ an einer Position bedeutet, dass dieser Eintrag beliebig sein kann. Der abschließende Zweig mit _ deckt alle übrigen Fälle ab.
using System;
class Program {
static string Move(bool fwd, bool turn) => (fwd, turn) switch {
(true, false) => "straight",
(true, true) => "curve",
(false, true) => "spin",
_ => "stop"
};
static void Main() => Console.WriteLine(Move(true, true));
}Binden in Tupeln
Positionen in einem Tupelmuster können Werte erfassen. (0, var y) passt, wenn das erste Element 0 ist, und bindet das zweite an y.
Sie können die gebundene Variable anschließend im Ergebnis des Zweigs oder in einer when-Schutzbedingung verwenden und so Abgleich und Extraktion in einem Schritt kombinieren.
var point = (0, 7);
string r = point switch
{
(0, var y) => $"on y-axis at {y}",
(var x, 0) => $"on x-axis at {x}",
_ => "elsewhere"
};
System.Console.WriteLine(r);Listenmuster
Ein Listenmuster gleicht Arrays und Listen anhand ihrer Elemente ab und wird mit eckigen Klammern geschrieben: [1, 2, 3]. Es passt, wenn Länge und jedes Elementmuster übereinstimmen.
Listenmuster wurden mit C# 11 eingeführt und ermöglichen es, direkt anhand der Form einer Sequenz zu verzweigen, ohne Länge und Indizes manuell prüfen zu müssen.
int[] data = { 1, 2, 3 };
string shape = data switch
{
[] => "empty",
[_] => "one",
[_, _] => "two",
_ => "many"
};
System.Console.WriteLine(shape);Exakte Elemente abgleichen
Listenmuster können für jede Position bestimmte Werte abgleichen. [1, 2, 3] passt nur auf genau diese Sequenz aus drei Elementen.
Kombinieren Sie Konstanten und Discards beliebig: [1, _, 3] passt auf eine Liste der Länge drei, die mit 1 beginnt und mit 3 endet, wobei das mittlere Element ignoriert wird.
using System;
class Program {
static void Main() {
int[] a = { 1, 9, 3 };
bool ok = a is [1, _, 3];
Console.WriteLine(ok);
}
}Das Slice-Muster
Das Slice-Muster .. gleicht an einer Position eine beliebige Anzahl von Elementen ab, einschließlich null. Ein Listenmuster darf höchstens einen Slice enthalten.
[1, .., 9] passt auf jede Liste, die mit 1 beginnt und mit 9 endet, unabhängig davon, was dazwischen liegt. Das eignet sich hervorragend für Prüfungen von Anfang und Ende einer Liste.
int[] nums = { 1, 4, 5, 9 };
string r = nums switch
{
[1, .., 9] => "1..9 bookends",
_ => "other"
};
System.Console.WriteLine(r);Einen Slice erfassen
Der Slice kann die übersprungenen Elemente mithilfe von var in einer Variablen erfassen: [first, .. var rest].
Der erfasste Abschnitt ist selbst ein Array oder eine Liste des abgeglichenen Typs. Dadurch können Sie ein erstes Element destrukturieren und den Rest zur weiteren Verarbeitung behalten.
using System;
class Program {
static void Main() {
int[] xs = { 10, 20, 30, 40 };
if (xs is [var head, .. var tail])
Console.WriteLine($"{head} then {tail.Length} more");
}
}Randelemente binden
Sie können beide Enden um einen Slice herum binden: [var first, .., var last] erfasst das erste und letzte Element und ignoriert die Mitte.
Das ist eine kompakte Schreibweise für Sequenzen, bei denen nur die Grenzen wichtig sind, etwa um zu prüfen, ob eine Route an bekannten Punkten beginnt und endet.
using System;
class Program {
static void Main() {
string[] route = { "A", "B", "C", "D" };
if (route is [var start, .., var end])
Console.WriteLine($"{start} -> {end}");
}
}Listenmuster mit Teilmustern
Jede Listenposition kann ein beliebiges Muster verwenden, einschließlich relationaler und logischer Muster. [> 0, > 0] passt auf eine Liste aus zwei positiven Werten.
Damit lässt sich das gesamte Repertoire an Mustern auf den Abgleich von Sequenzen anwenden, sodass Sie Form und Inhalt in einem einzigen Ausdruck prüfen können.
int[] pair = { 3, 8 };
string r = pair switch
{
[> 0, > 0] => "both positive",
[_, _] => "mixed",
_ => "wrong size"
};
System.Console.WriteLine(r);Tupel und Listen verschachteln
Tupel- und Listenmuster können ineinander sowie in Eigenschaftsmustern verschachtelt werden. Eine Tupelposition kann ein Listenmuster enthalten und umgekehrt.
So können Sie komplexe strukturierte Daten, etwa eine beschriftete Sequenz, in einem einzigen Ausdruck abgleichen statt mit mehreren verschachtelten Prüfungen.
using System;
class Program {
static void Main() {
(string, int[]) record = ("primes", new[]{ 2, 3 });
string r = record switch {
("primes", [2, ..]) => "starts with 2",
_ => "other"
};
Console.WriteLine(r);
}
}Voraussetzungen für Listenmuster
Listenmuster funktionieren mit jedem Typ, der zählbar und indizierbar ist: Er benötigt eine Eigenschaft Length oder Count sowie einen Indexer. Arrays, List<T> und Zeichenfolgen erfüllen diese Voraussetzungen.
Für die Erfassung eines Slice ist zusätzlich eine Slice-Methode oder ein Bereichsindexer erforderlich. Die meisten integrierten Collections unterstützen beides sofort.
string s = "cat";
bool isCat = s is ['c', 'a', 't'];
System.Console.WriteLine(isCat);Kurzer Test
Testen Sie Ihr Verständnis von Listen- und Tupelmustern.
Zusammenfassung
Tupelmuster gleichen mehrere Werte in Klammern ab; Listenmuster gleichen die Form einer Sequenz in eckigen Klammern ab, wobei .. als Slice die Mitte mithilfe von var erfassen kann.
Positionen akzeptieren beliebige Teilmuster und können frei verschachtelt werden. Listenmuster benötigen einen zählbaren, indizierbaren Typ. Sie beherrschen nun das vollständige C#-Repertoire an Mustern.
Häufig gestellte Fragen
Ist die Lektion „Listen- und Tupel-Patterns“ kostenlos?
Ja — der vollständige Text von „Listen- und Tupel-Patterns“ 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 „Listen- und Tupel-Patterns“?
Destrukturieren Sie Collections. 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 4 von 4.
Wie lange dauert die Lektion „Listen- und Tupel-Patterns“?
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
- switch-Ausdrücke
- Typ- und Property-Patterns
- Relationale und logische Patterns
- Listen- und Tupel-Patterns