Liste- og tuplemønstre
Destrukturér samlinger.
Liste- og tuplemønstre er en gratis C# Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i C# Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C# Academy-kurset indeholder 4 lektioner i alt.
Tuplemønstre
Et tuplemønster matcher flere værdier på én gang ved at omslutte dem med parenteser. Hver position matches af sit eget delmønster.
Det er ideelt til beslutninger, der afhænger af flere inddata, f.eks. en lille tilstandsmaskine eller en dommer i sten-saks-papir, alt sammen i én 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);En kørbar tuple-switch
Tuplemønstre gør beslutningstabeller læsbare. Her vælger to boolske værdier en handling.
Hver gren angiver et tuplemønster, og forkastelsestegnet _ på en position betyder, at pladsen kan indeholde hvad som helst. Den sidste gren med _ dækker resten.
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));
}Binding i tupler
Positioner i et tuplemønster kan indfange værdier. (0, var y) matcher, når det første element er 0, og binder det andet til y.
Du kan derefter bruge den bundne variabel i grenens resultat eller i en when-vagt og dermed kombinere matching og udtræk i ét trin.
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);Listemønstre
Et listemønster matcher arrayer og lister ud fra deres elementer og skrives med kantede parenteser: [1, 2, 3]. Det matcher, når længden og hvert elementmønster stemmer overens.
Listemønstre blev introduceret i C# 11 og lader dig forgrene direkte ud fra en sekvens' struktur uden manuelle tjek af længde og indeks.
int[] data = { 1, 2, 3 };
string shape = data switch
{
[] => "empty",
[_] => "one",
[_, _] => "two",
_ => "many"
};
System.Console.WriteLine(shape);Matching af præcise elementer
Listemønstre kan matche bestemte værdier på hver position. [1, 2, 3] matcher kun den præcise sekvens med tre elementer.
Bland frit konstanter og forkastelser: [1, _, 3] matcher en liste med tre elementer, der begynder med 1 og slutter med 3, mens midten ignoreres.
using System;
class Program {
static void Main() {
int[] a = { 1, 9, 3 };
bool ok = a is [1, _, 3];
Console.WriteLine(ok);
}
}Udsnitsmønsteret
Udsnitsmønsteret .. matcher et vilkårligt antal elementer, inklusive nul, på én position. Et listemønster må højst indeholde ét udsnit.
[1, .., 9] matcher enhver liste, der begynder med 1 og slutter med 9, uanset hvad der ligger imellem. Det er velegnet til tjek af hoved og hale.
int[] nums = { 1, 4, 5, 9 };
string r = nums switch
{
[1, .., 9] => "1..9 bookends",
_ => "other"
};
System.Console.WriteLine(r);Indfangning af et udsnit
Udsnittet kan indfange de oversprungne elementer i en variabel ved hjælp af var: [first, .. var rest].
Den indfangede del er selv en array eller liste af den matchede type, så du kan udtrække et første element og beholde resten til videre behandling.
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");
}
}Binding af kantelementer
Du kan binde begge ender omkring et udsnit: [var first, .., var last] indfanger det første og sidste element, mens midten ignoreres.
Det er en kompakt løsning til sekvenser, hvor kun grænserne er relevante, f.eks. når du vil kontrollere, at en rute begynder og slutter ved kendte punkter.
using System;
class Program {
static void Main() {
string[] route = { "A", "B", "C", "D" };
if (route is [var start, .., var end])
Console.WriteLine($"{start} -> {end}");
}
}Listemønstre med delmønstre
Hver listeposition kan bruge et hvilket som helst mønster, herunder relationelle og logiske mønstre. [> 0, > 0] matcher en liste med to positive elementer.
På den måde kombineres hele værktøjskassen af mønstre til matching af sekvenser, så du kan kontrollere både struktur og indhold i ét udtryk.
int[] pair = { 3, 8 };
string r = pair switch
{
[> 0, > 0] => "both positive",
[_, _] => "mixed",
_ => "wrong size"
};
System.Console.WriteLine(r);Indlejring af tupler og lister
Tuple- og listemønstre kan indlejres i hinanden og i egenskabsmønstre. En tupleposition kan indeholde et listemønster, og omvendt.
Det lader dig matche komplekse strukturerede data, f.eks. en mærket sekvens, i ét udtryk i stedet for flere indlejrede tjek.
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);
}
}Krav til listemønstre
Listemønstre fungerer på alle typer, der kan tælles og indekseres: typen skal have en Length- eller Count-egenskab og en indekser. Arrayer, List<T> og strenge opfylder kravene.
Indfangning af udsnit kræver desuden en udsnitsmetode eller en intervalindekser. De fleste indbyggede samlinger understøtter begge dele direkte.
string s = "cat";
bool isCat = s is ['c', 'a', 't'];
System.Console.WriteLine(isCat);Hurtigt tjek
Test din forståelse af liste- og tuplemønstre.
Opsummering
Tuplemønstre matcher flere værdier i parenteser; listemønstre matcher sekvensers struktur i kantede parenteser, hvor .. er et udsnit, der kan indfange midten via var.
Positioner accepterer alle delmønstre og kan frit indlejres. Listemønstre kræver en type, der kan tælles og indekseres. Du har nu styr på hele C#-værktøjskassen til mønstergenkendelse.
Lær C# med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 93
- Lektioner
- 346
Ofte stillede spørgsmål
Er lektionen “Liste- og tuplemønstre” gratis?
Ja — hele teksten til “Liste- og tuplemønstre” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af C# Academy-kurset, skal du opgradere til CoddyKit PRO. C# Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Liste- og tuplemønstre”?
Destrukturér samlinger. Du øver dig i C# Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på C# Academy?
Der kræves ingen tidligere erfaring. C# Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.
Hvor lang tid tager lektionen “Liste- og tuplemønstre”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne C# Academy-lektion?
Ja. Alle C# Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- switch-udtryk
- Type- og egenskabsmønstre
- Relationelle og logiske mønstre
- Liste- og tuplemønstre