Шаблоны списков и кортежей
Деструктурируйте коллекции.
«Шаблоны списков и кортежей» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Выражения switch
- Шаблоны типов и свойств
- Реляционные и логические шаблоны
- Шаблоны списков и кортежей