Pattern di liste e tuple
Destrutturi le collezioni.
Pattern di liste e tuple è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 4 lezioni in totale.
Pattern di tupla
Un pattern di tupla confronta più valori contemporaneamente racchiudendoli tra parentesi. Ogni posizione viene confrontata con il proprio sottopattern.
È ideale per decisioni che dipendono da più input, come una piccola macchina a stati o un arbitro di morra cinese, tutto all'interno di un unico 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);Uno switch di tuple eseguibile
I pattern di tupla rendono leggibili le tabelle decisionali. Qui due valori booleani determinano un'azione.
Ogni ramo elenca un pattern di tupla e il discard _ in una posizione indica che quello slot può contenere qualsiasi valore. Il ramo finale _ gestisce tutti i casi rimanenti.
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));
}Acquisizione nelle tuple
Le posizioni di un pattern di tupla possono acquisire valori. (0, var y) corrisponde quando il primo elemento è 0 e assegna il secondo a y.
Può quindi usare la variabile acquisita nel risultato del ramo o in una guardia when, combinando confronto ed estrazione in un unico passaggio.
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);Pattern di lista
Un pattern di lista confronta array e liste in base ai relativi elementi, usando parentesi quadre: [1, 2, 3]. Corrisponde quando la lunghezza e il pattern di ogni elemento coincidono.
Introdotti in C# 11, i pattern di lista consentono di diramare direttamente in base alla forma di una sequenza, senza controlli manuali di lunghezza e indice.
int[] data = { 1, 2, 3 };
string shape = data switch
{
[] => "empty",
[_] => "one",
[_, _] => "two",
_ => "many"
};
System.Console.WriteLine(shape);Corrispondenza di elementi esatti
I pattern di lista possono confrontare valori specifici in ogni posizione. [1, 2, 3] corrisponde solo a quella precisa sequenza di tre elementi.
Combini liberamente costanti e discard: [1, _, 3] corrisponde a una lista di tre elementi che inizia con 1 e termina con 3, ignorando l'elemento centrale.
using System;
class Program {
static void Main() {
int[] a = { 1, 9, 3 };
bool ok = a is [1, _, 3];
Console.WriteLine(ok);
}
}Il pattern slice
Il pattern slice .. corrisponde a un numero qualsiasi di elementi, incluso zero, in un'unica posizione. Un pattern di lista può contenere al massimo uno slice.
[1, .., 9] corrisponde a qualsiasi lista che inizi con 1 e termini con 9, indipendentemente dagli elementi intermedi. È ideale per controllare testa e coda.
int[] nums = { 1, 4, 5, 9 };
string r = nums switch
{
[1, .., 9] => "1..9 bookends",
_ => "other"
};
System.Console.WriteLine(r);Acquisire uno slice
Lo slice può acquisire gli elementi saltati in una variabile usando var: [first, .. var rest].
La parte acquisita è a sua volta un array o una lista del tipo confrontato, così può destrutturare l'elemento iniziale e conservare la coda per ulteriori elaborazioni.
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");
}
}Associare gli elementi ai bordi
Può associare entrambi gli estremi attorno a uno slice: [var first, .., var last] acquisisce il primo e l'ultimo elemento ignorando quelli centrali.
È una forma concisa per le sequenze in cui contano solo i limiti, ad esempio per verificare che un percorso inizi e termini in punti noti.
using System;
class Program {
static void Main() {
string[] route = { "A", "B", "C", "D" };
if (route is [var start, .., var end])
Console.WriteLine($"{start} -> {end}");
}
}Pattern di lista con sottopattern
Ogni posizione della lista può usare qualsiasi pattern, inclusi quelli relazionali e logici. [> 0, > 0] corrisponde a una lista di due elementi positivi.
In questo modo l'intero insieme di strumenti dei pattern può essere applicato alle sequenze, consentendo di verificare forma e contenuto in un'unica espressione.
int[] pair = { 3, 8 };
string r = pair switch
{
[> 0, > 0] => "both positive",
[_, _] => "mixed",
_ => "wrong size"
};
System.Console.WriteLine(r);Annidare tuple e liste
I pattern di tupla e di lista possono essere annidati l'uno nell'altro e all'interno di pattern di proprietà. Una posizione di una tupla può contenere un pattern di lista e viceversa.
Questo consente di confrontare dati strutturati complessi, come una sequenza con etichette, in un'unica espressione invece di usare diversi controlli annidati.
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);
}
}Requisiti dei pattern di lista
I pattern di lista funzionano con qualsiasi tipo dotato di conteggio e indicizzabile: deve avere una proprietà Length o Count e un indicizzatore. Array, List<T> e stringhe soddisfano questi requisiti.
L'acquisizione di uno slice richiede inoltre un metodo slice o un indicizzatore di intervallo. La maggior parte delle raccolte integrate supporta entrambe le funzionalità immediatamente.
string s = "cat";
bool isCat = s is ['c', 'a', 't'];
System.Console.WriteLine(isCat);Verifica rapida
Metta alla prova la Sua comprensione dei pattern di lista e di tupla.
Riepilogo
I pattern di tupla confrontano più valori tra parentesi; i pattern di lista confrontano la forma di una sequenza tra parentesi quadre, usando .. come slice che può acquisire la parte centrale tramite var.
Le posizioni accettano qualsiasi sottopattern e possono essere annidate liberamente. I pattern di lista richiedono un tipo dotato di conteggio e indicizzabile. Ora dispone dell'intero insieme di strumenti dei pattern di C#.
Domande Frequenti
La lezione «Pattern di liste e tuple» è gratuita?
Sì — il testo completo di «Pattern di liste e tuple» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 4 lezioni in totale.
Cosa imparerò in «Pattern di liste e tuple»?
Destrutturi le collezioni. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C# Academy?
Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Pattern di liste e tuple»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C# Academy?
Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Espressioni switch
- Pattern di tipo e proprietà
- Pattern relazionali e logici
- Pattern di liste e tuple