> For the complete documentation index, see [llms.txt](https://gabriel-schade-cardoso.gitbook.io/tango-br/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://gabriel-schade-cardoso.gitbook.io/tango-br/conceitos/pattern-matching.md).

# Utilizando comparação de padrões (Pattern Matching)

Comparação (ou correspondência) de padrões, do inglês *pattern matching* é um dos conceitos fundamentais da programação funcional.

Este conceito pode substituir uma série de desvios de fluxo de código, tais como:

* Comparações If-else&#x20;
* Switch-cases
* Laços de repetição (for, foreach, while e do)
* Comparação de tipos

Um pattern matching na linguagem F# para substituir uma comparação de If, possui uma sintaxe similar à:

```fsharp
match expressaoBooleana with
| true  -> //padrão para o caso true 
| false -> //padrão para o caso false
```

Mas podemos realizar comparações entre diferentes padrões, veja um exemplo com um valor inteiro:

```fsharp
let valor = 10
match valor with
| 1 | 2 | 3         -> //Quando o valor for 1, 2 ou 3
| n when n % 2 = 0  -> //Quando o valor for par
| 5                 -> //Quando o valor for 5
| _                 -> //Outros casos
```

Existem uma série de benefícios com a utilização do pattern matching, tanto que, a partir da versão 7.0 do C# é possível utilizarmos esta funcionalidade nativamente na linguagem, conforme documentação da [Microsoft](https://docs.microsoft.com/pt-br/dotnet/csharp/pattern-matching).

Como implementação na biblioteca **Tango** alguns tipos de objetos possuem um método chamado `Match`.

Este método espera por parâmetros funções (Métodos ou expressões lambdas) para os possíveis padrões de acordo com cada tipo.

Além dele, também há a implementação de um segundo método chamado `Match2`, este método é similar ao primeiro, mas neste caso o padrão é aplicado sobre dois valores diferentes do mesmo tipo ao invés de apenas um valor.
