C# 11 -  List Patterns Matching


  Hoje veremos o novo recurso do C# 11 :  List Patterns Matching ou Correspondência de padrões de lista.

A partir do C# 11, arrays ou listas podem ser combinados com a sequência de elementos. Assim agora existe a possibilidade de utilizarmos a funcionalidade chamada de List Patterns para simplificar a manipulação de arrays e Lists.

Então, vamos considerar o exemplo dado a seguir:

- Temos um array com alguns números (série de Fibonacci);
- Temos uma declaração condicional onde a instrução if está usando uma palavra-chave 'is' e está tentando combinar o array da série de Fibonacci com outra lista que é uma lista de números separados por vírgula, especificados entre dois colchetes.

A comparação vai retornar true somente se cada elemento estiver presente em ambas as listas exatamente no mesmo índice. Abaixo o exemplo de código :


As correspondências de padrões de lista

De acordo com a documentação, existem três maneiras diferentes de correspondência de padrões de lista :

1.  Discard pattern ou Padrão Descartar

O pattern discard (_) pode ser utilizado para referenciar um único elemento de um array ou List;

2.  Range pattern ou Padrão de intervalo

O pattern range (..) permite refenciar zero ou mais elementos;

3.  Var pattern ou Padrão de var

O pattern var pode ser usado para um novo array ou List, em um processo de “fatiamento” (slice) de uma referência baseada nessas estruturas.

Vamos tentar entender como esses padrões funcionam...

1- Padrão Discard

Esse padrão é útil para combinar um ou mais elementos de uma sequência, desde que saibamos o comprimento da sequência.

Então, digamos que queremos descobrir se um número, 1, está presente na primeira posição em uma sequência de 5 elementos.

Nesse caso, a sequência a ser usada na condição if deve ser [ 1 , _, _, _ , _ ], conforme mostrado no trecho de código abaixo:



Conforme mostrado no código acima, você pode especificar um ou mais elementos para correspondência de padrões de lista. A única restrição é que você precisa saber o comprimento da sequência com a qual está comparando. Caso contrário, a comparação sempre retornará false.

2- Padrão Range

Se o comprimento da sequência a ser comparada não for conhecido, o padrão de intervalo pode ser útil. Dois pontos(..) podem ser usados para especificar que qualquer número de elementos pode estar presente no lugar desses dois pontos (..). Observe que dois pontos podem ser usados apenas uma vez na sequência.

O trecho de código abaixo mostra alguns exemplos deste padrão:

O padrão que usamos é um padrão constante, o que significa que usamos diretamente os números na sequência. Também temos a opção de usar o padrão relacional – o que significa que podemos especificar as expressões de comparação conforme mostrado no trecho de código abaixo :

3- O padrão var

Nesse padrão, podemos especificar a palavra-chave var seguida do nome da variável. Isso significa que o padrão vai capturar o elemento presente naquela posição. Essa variável pode ser usada no mesmo escopo para qualquer finalidade que você precisar.

No trecho de código abaixo, há dois casos:

  1. No primeiro bloco IF…ELSE, as listas coincidem e os valores das variáveis são então impressos no console;
  2. No segundo bloco IF…ELSE, as listas não coincidem;

O recurso da correspondência de padrões de lista pode ser útil para comparar os dados de arquivos CSV ou arquivos de coluna de comprimento fixo. Se os dados não estiverem presentes em todas as colunas, a correspondência de padrões de lista será útil conforme a documentação.

E estamos conversados...

"Dando graças ao Pai que nos fez idôneos para participar da herança dos santos na luz;
O qual nos tirou da potestade das trevas, e nos transportou para o reino do Filho do seu amor;"
Colossenses 1:12,13

Referências:


José Carlos Macoratti