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

Последнее обновление: 07.01.2022

В 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
};
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850