Неплохая статья с примерами: [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 позволяет извлекать значения из объекта с помощью метода деконструкции. Это удобно, когда вам нужно присвоить значения внутренних полей или свойств объекта локальным переменным. И внутри каждого из этих шаблонов, в свою очередь, могут быть использованы другие шаблоны, образуя сложную иерархию или "рекурсию" шаблонов.