0Pricing
C# Academy · Урок

Шаблоны списков и кортежей

Деструктурируйте коллекции.

«Шаблоны списков и кортежей» — бесплатный урок C# Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.

Шаблоны кортежей

Шаблон кортежа сопоставляет сразу несколько значений, заключая их в круглые скобки. Для каждой позиции используется собственный вложенный шаблон.

Это особенно удобно для решений, зависящих от нескольких входных данных, например для небольшой машины состояний или определения результата в игре «камень, ножницы, бумага» в одном операторе выбора.

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

Рабочий оператор выбора по кортежу

Шаблоны кортежей делают таблицы решений понятными. Здесь два логических значения выбирают действие.

Каждая ветвь содержит шаблон кортежа, а символ отбрасывания _ в позиции означает, что в этой ячейке может находиться любое значение. Последняя ветвь с _ охватывает остальные варианты.

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

Привязка внутри кортежей

Позиции в шаблоне кортежа могут извлекать значения. Шаблон (0, var y) совпадает, если первый элемент равен 0, и связывает второй элемент с y.

Затем связанную переменную можно использовать в результате ветви или в защитном условии when, одновременно выполняя сопоставление и извлечение.

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

Шаблоны списков

Шаблон списка сопоставляет массивы и списки по их элементам и записывается в квадратных скобках: [1, 2, 3]. Сопоставление выполняется, когда длина и шаблон каждого элемента совпадают.

Шаблоны списков появились в C# 11 и позволяют напрямую выбирать ветвь по форме последовательности, без ручной проверки длины и индексов.

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

Сопоставление точных элементов

Шаблоны списков могут сопоставлять конкретные значения в каждой позиции. Шаблон [1, 2, 3] совпадает только с этой точной последовательностью из трёх элементов.

Свободно сочетайте константы и отбрасывание: [1, _, 3] совпадает со списком длины три, который начинается с 1 и заканчивается 3, игнорируя средний элемент.

using System;

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

Шаблон среза

Шаблон среза .. сопоставляет любое количество элементов, включая ноль, в одной позиции. Шаблон списка может содержать не более одного среза.

[1, .., 9] совпадает с любым списком, который начинается с 1 и заканчивается 9, независимо от содержимого между ними. Это удобно для проверок head и tail.

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

Сохранение среза

Срез можно сохранить в переменную с помощью var: [first, .. var rest].

Извлечённая часть сама является массивом или списком сопоставляемого типа, поэтому можно извлечь элемент head и сохранить tail для дальнейшей обработки.

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

Привязка крайних элементов

Можно связать оба конца вокруг среза: [var first, .., var last] сохраняет первый и последний элементы, игнорируя середину.

Это краткая запись для последовательностей, где важны только границы, например при проверке, что маршрут начинается и заканчивается в известных точках.

using System;

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

Шаблоны списков с вложенными шаблонами

Для каждой позиции списка можно использовать любой шаблон, включая реляционные и логические. Шаблон [> 0, > 0] совпадает с двухэлементным списком положительных чисел.

Так весь набор средств сопоставления объединяется для работы с последовательностями, и Вы можете за одно выражение проверить и форму, и содержимое.

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

Вложение кортежей и списков

Шаблоны кортежей и списков могут вкладываться друг в друга и в шаблоны свойств. Позиция кортежа может содержать шаблон списка, и наоборот.

Это позволяет сопоставлять сложные структурированные данные, например помеченную последовательность, одним выражением вместо нескольких вложенных проверок.

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

Требования к шаблонам списков

Шаблоны списков работают с любым типом, который поддерживает подсчёт и индексацию: ему требуется свойство Length или Count и индексатор. Этим требованиям соответствуют массивы, List<T> и строки.

Для сохранения среза дополнительно требуется метод среза или индексатор диапазона. Большинство встроенных коллекций поддерживает и то и другое из коробки.

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

Быстрая проверка

Проверьте, насколько Вы поняли шаблоны списков и кортежей.

Итоги

Шаблоны кортежей сопоставляют несколько значений в круглых скобках; шаблоны списков сопоставляют форму последовательности в квадратных скобках, а .. обозначает срез, который может сохранить середину с помощью var.

В позициях можно использовать любые вложенные шаблоны и свободно комбинировать их. Для шаблонов списков нужен тип, поддерживающий подсчёт и индексацию. Теперь Вы владеете всем набором средств сопоставления шаблонов C#.

Часто задаваемые вопросы

Урок «Шаблоны списков и кортежей» бесплатный?

Да — полный текст урока «Шаблоны списков и кортежей» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.

Чему я научусь в уроке «Шаблоны списков и кортежей»?

Деструктурируйте коллекции. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Шаблоны списков и кортежей»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Выражения switch
  2. Шаблоны типов и свойств
  3. Реляционные и логические шаблоны
  4. Шаблоны списков и кортежей
← Назад к C# Academy