0Pricing
C# Academy · Lezione

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

  1. Espressioni switch
  2. Pattern di tipo e proprietà
  3. Pattern relazionali e logici
  4. Pattern di liste e tuple
← Torna a C# Academy