0Pricing
C# Academy · Lekcja

Wzorce list i krotek

Zdestrukturyzuje Pan/Pani kolekcje.

Wzorce list i krotek to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.

Wzorce krotek

Wzorzec krotki dopasowuje kilka wartości jednocześnie, umieszczając je w nawiasach. Każda pozycja jest dopasowywana za pomocą własnego podwzorca.

Takie rozwiązanie doskonale sprawdza się w decyzjach zależnych od wielu danych wejściowych, na przykład w małej maszynie stanów lub sędziowaniu gry w papier, kamień, nożyce — wszystko w ramach jednego przełącznika.

int x = 0, y = 5;
string quadrant = (x, y) switch
{
    (0, 0) => "origin",
    (0, _) => "y-axis",
    (_, 0) => "x-axis",
    _ => "plane"
};
System.Console.WriteLine(quadrant);

Działający przełącznik krotek

Wzorce krotek zwiększają czytelność tabel decyzyjnych. W tym przykładzie dwie wartości logiczne wybierają działanie.

Każde ramię zawiera wzorzec krotki, a symbol odrzucenia _ na danej pozycji oznacza, że może się tam znajdować dowolna wartość. Ostatnie ramię _ obejmuje wszystkie pozostałe przypadki.

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));
}

Wiązanie wartości wewnątrz krotek

Pozycje we wzorcu krotki mogą przechwytywać wartości. (0, var y) pasuje wtedy, gdy pierwszy element ma wartość 0, a drugi zostaje przypisany do y.

Następnie można użyć powiązanej zmiennej w wyniku ramienia lub w strażniku when, łącząc dopasowywanie i pobieranie wartości w jednym kroku.

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);

Wzorce list

Wzorzec listy dopasowuje tablice i listy na podstawie ich elementów, używając nawiasów kwadratowych: [1, 2, 3]. Dopasowanie zachodzi, gdy długość oraz wzorzec każdego elementu są zgodne.

Wprowadzone w C# 11 wzorce list pozwalają bezpośrednio rozgałęziać wykonanie na podstawie kształtu sekwencji, bez ręcznego sprawdzania długości i indeksów.

int[] data = { 1, 2, 3 };
string shape = data switch
{
    [] => "empty",
    [_] => "one",
    [_, _] => "two",
    _ => "many"
};
System.Console.WriteLine(shape);

Dopasowywanie dokładnych elementów

Wzorce list mogą dopasowywać określone wartości na poszczególnych pozycjach. [1, 2, 3] pasuje wyłącznie do dokładnie tej trzyelementowej sekwencji.

Można swobodnie łączyć stałe i symbole odrzucenia: [1, _, 3] pasuje do listy o długości trzech elementów, która zaczyna się od 1 i kończy na 3, ignorując element środkowy.

using System;

class Program {
    static void Main() {
        int[] a = { 1, 9, 3 };
        bool ok = a is [1, _, 3];
        Console.WriteLine(ok);
    }
}

Wzorzec wycinka

Wzorzec wycinka .. dopasowuje dowolną liczbę elementów, również zero, na jednej pozycji. Wzorzec listy może zawierać najwyżej jeden wycinek.

[1, .., 9] pasuje do dowolnej listy, która zaczyna się od 1 i kończy na 9, niezależnie od elementów pomiędzy nimi. Jest to bardzo przydatne przy sprawdzaniu początku i końca sekwencji.

int[] nums = { 1, 4, 5, 9 };
string r = nums switch
{
    [1, .., 9] => "1..9 bookends",
    _ => "other"
};
System.Console.WriteLine(r);

Przechwytywanie wycinka

Wycinek może przechwycić pomijane elementy do zmiennej za pomocą var: [first, .. var rest].

Przechwycona część jest sama tablicą lub listą dopasowanego typu, dzięki czemu można rozłożyć pierwszy element i zachować pozostałą część do dalszego przetwarzania.

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");
    }
}

Wiązanie elementów brzegowych

Można powiązać oba końce wokół wycinka: [var first, .., var last] przechwytuje pierwszy i ostatni element, ignorując środek.

Jest to zwięzłe rozwiązanie dla sekwencji, w których znaczenie mają tylko granice, na przykład podczas sprawdzania, czy trasa zaczyna się i kończy w znanych punktach.

using System;

class Program {
    static void Main() {
        string[] route = { "A", "B", "C", "D" };
        if (route is [var start, .., var end])
            Console.WriteLine($"{start} -> {end}");
    }
}

Wzorce list z podwzorcami

Każda pozycja listy może używać dowolnego wzorca, w tym relacyjnego i logicznego. [> 0, > 0] pasuje do dwuelementowej listy liczb dodatnich.

Dzięki temu cały zestaw narzędzi wzorców można wykorzystać do dopasowywania sekwencji, sprawdzając ich kształt i zawartość w jednym wyrażeniu.

int[] pair = { 3, 8 };
string r = pair switch
{
    [> 0, > 0] => "both positive",
    [_, _] => "mixed",
    _ => "wrong size"
};
System.Console.WriteLine(r);

Zagnieżdżanie krotek i list

Wzorce krotek i list można zagnieżdżać w sobie nawzajem oraz we wzorcach właściwości. Pozycja krotki może zawierać wzorzec listy, a wzorzec listy może zawierać krotkę.

Pozwala to dopasowywać złożone dane strukturalne, takie jak oznaczona sekwencja, w jednym wyrażeniu zamiast za pomocą kilku zagnieżdżonych sprawdzeń.

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);
    }
}

Wymagania dotyczące wzorców list

Wzorce list działają na każdym typie, który jest zliczalny i indeksowalny: musi on mieć właściwość Length lub Count oraz indeksator. Tablice, List<T> i ciągi znaków spełniają te wymagania.

Przechwytywanie wycinka wymaga dodatkowo metody wycinka lub indeksatora zakresu. Większość wbudowanych kolekcji obsługuje oba mechanizmy od razu.

string s = "cat";
bool isCat = s is ['c', 'a', 't'];
System.Console.WriteLine(isCat);

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat wzorców list i krotek.

Podsumowanie

Wzorce krotek dopasowują wiele wartości ujętych w nawiasy, a wzorce list dopasowują kształt sekwencji zapisany w nawiasach kwadratowych; .. oznacza wycinek, który może przechwycić środkową część za pomocą var.

Pozycje mogą przyjmować dowolny podwzorzec i można je swobodnie zagnieżdżać. Wzorce list wymagają typu zliczalnego i indeksowalnego. Znają już Państwo cały zestaw narzędzi wzorców języka C#.

Często zadawane pytania

Czy lekcja „Wzorce list i krotek” jest bezpłatna?

Tak — pełny tekst „Wzorce list i krotek” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Wzorce list i krotek”?

Zdestrukturyzuje Pan/Pani kolekcje. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Wzorce list i krotek”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Wyrażenia switch
  2. Wzorce typów i właściwości
  3. Wzorce relacyjne i logiczne
  4. Wzorce list i krotek
← Powrót do C# Academy