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


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