Полное руководство по языку программирования С# 14 и платформе .NET 10 / Pattern matching

Реляционный и логический паттерны

Начальный ⏱ 2 мин чтения 👁 2 🕓 обновлено 11.08.2026

В C# 9.0 в язык были добавлены дополнительные паттерны - реляционный (relational pattern) и логический (logical pattern) паттерны.

Реляционный паттерн позволяет сравнить передаваемое в конструкцию значение с некоторыми значениями с помощью операций сравнения. Например, в зависимости от суммы вклада проценты по этому вкладу могут отличаться. Рассчитаем сумму процентов в зависимости от суммы вклада с использованием реляционного паттерна:


decimal Calculate(decimal sum)
{
	return sum switch {
		<= 0 => 0,              // если sum меньше или равно 0, возвращаем 0
		< 50000 => sum * 0.05m, // если sum меньше 50000, возвращаем sum * 0.05m
		< 100000 => sum * 0.1m, // если sum меньше 100000, возвращаем sum * 0.1m
		_ => sum * 0.2m        // в остальных случаях возвращаем sum * 0.2m
	};
}

Применение:


Console.WriteLine(Calculate(-200));     // 0
Console.WriteLine(Calculate(0));        // 0 
Console.WriteLine(Calculate(10000));    // 500
Console.WriteLine(Calculate(60000));    // 6000
Console.WriteLine(Calculate(200000));   // 40000

Логический паттерн позволяет использовать логические операторы and (логическое умножение или операция логического И) и or (логическое сложение или операция логического ИЛИ) для объединения операций сравнения. Например, передадим в метод возраст и возвратим соответствующее сообщение:


string CheckAge(int age)
{
	return age switch
	{
		<1 or >110 => "Недействительный возраст",   // если age больше 110 и меньше 1
		>=1 and <18 => "Доступ запрещен",           // если age равно или больше 1 и меньше 18
		_ => "Доступ разрешен"                      // в остальных случаях
	};
}

Применение:


Console.WriteLine(CheckAge(200));     // Недействительный возраст
Console.WriteLine(CheckAge(0));      // Недействительный возраст 
Console.WriteLine(CheckAge(17));    // Доступ запрещен
Console.WriteLine(CheckAge(18));   // Доступ разрешен

Еще один логический оператор - not используется для отрицания и возвращает true, если его аргумент равен false:


string CheckAge(int age) => age switch
{
	not 33 => "Обычный возраст",   // если age НЕ равен 33
	_ => "Вам 33 года"             // в остальных случаях, то есть если age = 33
};

Проверь себя

📋 Тест по теме «Реляционный и логический паттерны» Тест по теме

Практические задания

Лёгкое Ручная проверка Заполните пропуск в коде (1)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

_____ Calculate(decimal sum)
{
	return sum switch {
		<= 0 => 0,              // если sum меньше или равно 0, возвращаем 0
		< 50000 => sum * 0.05m, // если sum меньше 50000, возвращаем sum * 0.05m
		< 100000 => sum * 0.1m, // если sum меньше 100000, возвращаем sum * 0.1m
		_ => sum * 0.2m        // в остальных случаях возвращаем sum * 0.2m
	};
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (2)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

Console._____(Calculate(-200));     // 0
Console.WriteLine(Calculate(0));        // 0 
Console.WriteLine(Calculate(10000));    // 500
Console.WriteLine(Calculate(60000));    // 6000
Console.WriteLine(Calculate(200000));   // 40000
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (3)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

string CheckAge(int _____)
{
	return age switch
	{
		<1 or >110 => "Недействительный возраст",   // если age больше 110 и меньше 1
		>=1 and <18 => "Доступ запрещен",           // если age равно или больше 1 и меньше 18
		_ => "Доступ разрешен"                      // в остальных случаях
	};
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (4)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

Console.WriteLine(CheckAge(_____));     // Недействительный возраст
Console.WriteLine(CheckAge(0));      // Недействительный возраст 
Console.WriteLine(CheckAge(17));    // Доступ запрещен
Console.WriteLine(CheckAge(18));   // Доступ разрешен
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (5)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

string CheckAge(int age) => age switch
{
	_____ 33 => "Обычный возраст",   // если age НЕ равен 33
	_ => "Вам 33 года"             // в остальных случаях, то есть если age = 33
};
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (1)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

decimal Calculate(decimal sum)
{
	return sum switch {
		<= _____ => _____,              // если sum меньше или равно 0, возвращаем 0
		< 50000 => sum * 0.05m, // если sum меньше 50000, возвращаем sum * 0.05m
		< 100000 => sum * 0.1m, // если sum меньше 100000, возвращаем sum * 0.1m
		_ => sum * 0.2m        // в остальных случаях возвращаем sum * 0.2m
	};
}
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (2)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

_____.WriteLine(_____(-200));     // 0
Console.WriteLine(Calculate(0));        // 0 
Console.WriteLine(Calculate(10000));    // 500
Console.WriteLine(Calculate(60000));    // 6000
Console.WriteLine(Calculate(200000));   // 40000
Войдите, чтобы отправить решение
Среднее Ручная проверка Расставьте строки кода в правильном порядке
+20 XP

Строки кода из примера этого урока перемешаны. Впишите их в правильном порядке, каждую строку — с новой строки.

Console.WriteLine(Calculate(-200));     // 0
Console.WriteLine(Calculate(200000));   // 40000
Console.WriteLine(Calculate(10000));    // 500
Console.WriteLine(Calculate(60000));    // 6000
Console.WriteLine(Calculate(0));        // 0
Войдите, чтобы отправить решение
Сложное Ручная проверка Объясните и модифицируйте пример из урока «Реляционный и логический паттерны»
+30 XP

Опишите своими словами, что делает приведённый пример кода из урока «Реляционный и логический паттерны», и предложите одно осмысленное изменение (например, другое входное значение или дополнительное условие). Приведите итоговый код.

decimal Calculate(decimal sum)
{
	return sum switch {
		<= 0 => 0,              // если sum меньше или равно 0, возвращаем 0
		< 50000 => sum * 0.05m, // если sum меньше 50000, возвращаем sum * 0.05m
		< 100000 => sum * 0.1m, // если sum меньше 100000, возвращаем sum * 0.1m
		_ => sum * 0.2m        // в остальных случаях возвращаем sum * 0.2m
	};
}
Войдите, чтобы отправить решение
Сложное Ручная проверка Найдите потенциальную проблему в коде урока «Реляционный и логический паттерны»
+30 XP

Изучите приведённый фрагмент кода и опишите, при каких входных данных или условиях он может сработать не так, как ожидается (граничный случай, отсутствие проверки и т.п.). Предложите исправленный вариант.

Console.WriteLine(Calculate(-200));     // 0
Console.WriteLine(Calculate(0));        // 0 
Console.WriteLine(Calculate(10000));    // 500
Console.WriteLine(Calculate(60000));    // 6000
Console.WriteLine(Calculate(200000));   // 40000
Войдите, чтобы отправить решение
Мини-проект Ручная проверка Мини-проект по теме «Реляционный и логический паттерны»
+50 XP

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

Войдите, чтобы отправить решение
Домашнее задание Ручная проверка Домашнее задание по теме «Реляционный и логический паттерны»
+25 XP

Напишите собственную небольшую программу, применяющую материал темы «Реляционный и логический паттерны». Используйте не менее одной конструкции, показанной в примерах урока. Прикрепите код решения и краткое описание того, что он делает.

Войдите, чтобы отправить решение

Обсуждение (0)

Войдите, чтобы оставить комментарий.