Підрозділ 9.3
Патерни кортежів
Показує tuple patterns у switch expression: зіставлення кількох значень кортежу, пропуск елементів через _ і комбінування умов.
9.3. Патерни кортежів
У попередніх секціях ми перевіряли один об'єкт або одне значення. Але багато практичних рішень залежать від кількох незалежних вимірів одночасно: «який протокол лікування призначити пацієнту, якщо його тиск категорії X і вік у діапазоні Y?». Перевіряти кожну комбінацію через вкладені if-else — громіздко і важко читати. Патерн кортежів вирішує це елегантно: передаємо кілька значень як кортеж у switch і описуємо кожну значущу комбінацію окремим arm.
Механізм: як це компілюється
Коли ви пишете:
(specialty, shift) switch
{
("Кардіологія", "День") => ...,
...
}Компілятор створює тимчасовий ValueTuple<string, string> з переданих значень і зіставляє його з кожним arm. Це той самий ValueTuple з розділу 8.9 — лише використаний не для зберігання і передачі, а як ключ для перемикання. Жодної магії: синтаксис (a, b) switch — це switch над кортежем.
Вкладені патерни в позиціях кортежу
Кожна позиція кортежу може містити будь-який патерн — не лише рядок або число. В позицію можна вставити:
- константу (
"Кардіологія",42); - discard
_— «будь-яке значення»; - реляційний патерн (
> 140,< 18); var ім'я— захопити значення у змінну;- навіть вкладений property pattern.
Це робить кортежний патерн потужним: один switch замінює складну ієрархію перевірок.

Клінічний приклад: розклад та правила призначень
Визначимо логіку призначення лікаря на прийом залежно від спеціалізації і зміни:
Arm-и обробляються зверху вниз: перший збіг виграє. Тому порядок важливий: конкретні комбінації мають іти першими, загальні (з _) — в кінці. Якщо поставити _ на початок — він поглине всі наступні arm-и.
Вкладені реляційні патерни: медичне рішення
Особливо потужна можливість — реляційні патерни в позиціях кортежу. Можна перевіряти не рівність значення, а діапазон:
Зверніть: у другій позиції кортежу стоїть >= 60 and < 120 — це логічний патерн всередині arm-а кортежу. Позиції кортежу дозволяють будь-який патерн, включаючи складені логічні вирази.
Вичерпність (exhaustiveness)
Компілятор аналізує, чи всі можливі комбінації значень покриті. Якщо ні і відсутній _ — попередження (warning). У switch expression це важливо: якщо жоден arm не збігається — кидається MatchFailedException у runtime.
Тому для кортежних патернів завжди завершуйте switch arm-ом _ або логічно повним набором умов, що покривають всі випадки.
Коли обирати кортежний патерн
Кортежний патерн найкраще підходить, коли:
- рішення залежить від двох або більше незалежних вимірів одночасно;
- кожна комбінація вимірів дає унікальний результат;
- альтернатива — вкладені
if-elseабо таблиця умов.
Якщо рішення залежить від властивостей одного об'єкта — краще використовувати патерн властивостей (9.2). Якщо рішення залежить від типу об'єкта в ієрархії — патерн типів (9.1). Кортежний патерн — для кількох незалежних вхідних змінних.