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