Неплохая статья с примерами: [link](https://www.geeksforgeeks.org/pattern-matching-in-c-sharp/)
В C# сопоставление с образцом было введено в версии 7.0, и с тех пор оно постоянно расширяется и развивается. Суть сопоставления с образцом заключается в том, что можно писать код, который будет выполняться в зависимости от того, какие структурные или семантические свойства имеют входные данные.
Pattern Matching делает код более чистым, наглядным и читаемым, позволяя легко представить сложные условные конструкции. Кроме того, Pattern Matching позволяет создавать более выразительные алгоритмы, что улучшает общую производительность программы.
Pattern Matching в C# включает в себя следующие паттерны (шаблоны / образцы):
* **Type patterns** (шаблоны типов): позволяют проверить, принадлежит ли значение определённому типу и привести его к этому типу.
* **Constant patterns** (шаблоны констант): сравнивают значение с константой.
* **Var patterns** (шаблоны переменных): всегда возвращают true и позволяют присвоить проверяемое значение новой переменной.
* **Relational patterns** (шаблоны отношений): используются для сравнения значений с использованием операторов отношений (>, <, >=, <=).
* **Logical patterns** (логические шаблоны): позволяют комбинировать другие шаблоны с помощью логических операторов (and, or, not).
* **Property patterns** (шаблоны свойств): позволяют проверить свойства объекта.
* **Tuple patterns** (шаблоны кортежей): позволяют работать с кортежами.
* **Recursive patterns** (рекурсивные шаблоны): позволяют проводить сложные проверки, комбинируя другие шаблоны.
* **When pattern** (шаблон "when"): используется для проверки условия после сопоставления шаблона.
* **Negated Pattern** (отрицательный шаблон): позволяют отрицать другие шаблоны, применяя логическое отрицание not.
* **Positional patterns** (позиционные шаблоны): Это расширение шаблонов типов, которое позволяет проверять и извлекать значения из объектов на основе их позиций. Это часто используется с кортежами и типами, которые поддерживают деконструкцию (deconstruction).
* **Discard pattern** обозначается символом подчеркивания \_ и используется, когда вам не нужно значение, которое соответствует шаблону.
* **Deconstruct pattern** Deconstruct pattern позволяет извлекать значения из объекта с помощью метода деконструкции. Это удобно, когда вам нужно присвоить значения внутренних полей или свойств объекта локальным переменным.
И внутри каждого из этих шаблонов, в свою очередь, могут быть использованы другие шаблоны, образуя сложную иерархию или "рекурсию" шаблонов.