Паттерны кортежей

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

Паттерны кортежей позволяют сравнивать значения кортежей. Например, передадим в конструкцию 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
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850