Clique no banner para conhecer e adquirir o meu treinamento de Bancos de Dados no Azure

CSharp (C#) – Como ordenar arquivos retornados pela DirectoryInfo.GetFiles utilizando Natural Sort

Visualizações: 1.222 views
Tempo de Leitura: 4 minutos

OlĂ¡ pessoal,
Bom dia!

Neste post vou fazer uma abordagem bem simples sobre algo que muitos desenvolvedores .NET buscam na internet, como eu mesmo busquei essa soluĂ§Ă£o, mas que Ă© um pouco complicado de encontrar, pois a maioria das soluções postadas nĂ£o funciona.

O meu problema era que eu utilizo muito uma funĂ§Ă£o C# no meu CLR para listar arquivos de um diretĂ³rio (JĂ¡ havia postado essa funĂ§Ă£o no post SQL Server – Como listar, ler, escrever, copiar, excluir e mover arquivos com o CLR (C#)), mas o fato dos arquivos nĂ£o serem ordenados da forma correta sempre me incomodou, e eu resolvi melhorar isso.

Exemplo do uso atual:
CSharp sort sorting DirectoryInfo.GetFiles by name natural sort 1

Mesmo que vocĂª utilize uma clĂ¡usula ORDER BY para tentar ordenar, isso nĂ£o vai funcionar, porque o SQL Server irĂ¡ fazer a ordenaĂ§Ă£o de strings utilizaĂ§Ă£o a ordenaĂ§Ă£o alfanumĂ©rica.

Como funciona o algoritmo de ordenaĂ§Ă£o de strings alfanumĂ©ricas
Esse tipo de algoritmo utiliza o cĂ³digo ASCII para ordenar os dados, comparando caractere por caractere atĂ© terminar a string ou o cĂ³digo ASCII de uma string for menor que o da outra. Desta forma, numa comparaĂ§Ă£o entre Arquivo 100 e Arquivo 20, a comparaĂ§Ă£o serĂ¡ feita da seguinte forma:

  • Cada caractere da palavra “Arquivo” serĂ¡ comparada entre as 2 strings. Como elas sĂ£o iguais, o algoritmo irĂ¡ prosseguir para o restante da string
  • O caractere “1” serĂ¡ comparado com o caractere “2”. Como ele Ă© menor, a ordenaĂ§Ă£o termina aĂ­, colocando “Arquivo 100” antes de “Arquivo 20”

Como funciona o algoritmo de ordenaĂ§Ă£o de strings Natural Sort
Assim como eu me incomodo com essa ordenaĂ§Ă£o, que Ă© a padrĂ£o pela grande maioria das linguagens de programaĂ§Ă£o, muita gente tambĂ©m nĂ£o gosta do “100” vir antes do “2000” e por para dar uma visĂ£o mais “humanizada”, foi-se criado o algoritmo de Natural Sort, que separa caracteres numĂ©ricos de letras, e os ordena separadamente. Os nĂºmeros sĂ£o comparados de forma numĂ©rica (onde 100 Ă© maior que 20), e as strings ele continua utilizando o cĂ³digo ASCII.

Para implementar o algoritmo Natural Sort, encontrei um cĂ³digo no blog do James McCormack para criar uma classe ICompare no C# e assim, ordenar os meus arquivos na minha funĂ§Ă£o (e qualquer outra lista de arquivos que vocĂª precisar ordenar).

Visualizar CĂ³digo-fonte da classe ICompare

Agora eu preciso alterar a minha funĂ§Ă£o de listar arquivos (tambĂ©m incluĂ­ uma flag booleana para listar arquivos dentro de subdiretĂ³rios ou nĂ£o) e incluir uma funĂ§Ă£o de OrderBy atravĂ©s da biblioteca LINQ.

Neste trecho:

Eu alterei para esse trecho:

E com isso, o nosso problema foi resolvido, onde temos o seguinte resultado:
CSharp sort sorting DirectoryInfo.GetFiles by name natural sort solved

Visualizar CĂ³digo-fonte completo dessa funĂ§Ă£o

Muito obrigado pela visita e atĂ© o prĂ³ximo post!