Паттерны кортежей позволяют сравнивать значения кортежей. Например, передадим в конструкцию switch кортеж с названием языка и времени дня и в зависимости от переданных данных возвратим определенное сообщение:
string GetWelcome(string lang, string daytime) => (lang, daytime) switch { ("english", "morning") => "Good morning", ("english", "evening") => "Good evening", ("german", "morning") => "Guten Morgen", ("german", "evening") => "Guten Abend", _ => "Здрасьть" };
Здесь в метод передаются два значения, из которых создается кортеж (можно и сразу передать в метод кортеж). Далее в конструкции switch с
помощью круглых скобок определяются значения, которым должны соответствовать элементы кортежа. Например, выражение ("english", "morning") => "Good morning"
будет выполняться, если одновременно lang="english" и datetime="morning".
Применение:
string message = GetWelcome("english", "evening"); Console.WriteLine(message); // Good evening message = GetWelcome("french", "morning"); Console.WriteLine(message); // Здрасьть
Нам не обязательно сравнивать все значения кортежа, мы можем использовать только некоторые элементы кортежа. В случае, если мы не хотим использовать элемент кортежа, то вместо него ставим прочерк:
string GetWelcome(string lang, string daytime, string status) => (lang, daytime, status) switch { ("english", "morning", _) => "Good morning", ("english", "evening", _) => "Good evening", ("german", "morning", _) => "Guten Morgen", ("german", "evening", _) => "Guten Abend", (_, _, "admin") => "Hello, Admin", _ => "Здрасьть" };
Теперь кортеж состоит из трех элементов. Но первые четыре выражения не используют последний элемент кортежа, допустим, он не важен,
поэтому вместо него ставится прочерк ("english", "morning", _)
.
А в предпоследнем примере, наоборот, не важны первые два элемента, а важен третий элемент: (_, _, "admin") =>
.
Но в любом случае нам надо указать конкретные значения или прочерки для всех элементов кортежа.
string message = GetWelcome("english", "evening", "user"); Console.WriteLine(message); // Good evening message = GetWelcome("french", "morning", "admin"); Console.WriteLine(message); // Hello, Admin