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.
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 ICompareAgora 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:
1 |
foreach (var fileInfo in directories) |
Eu alterei para esse trecho:
1 |
foreach (var fileInfo in directories.OrderBy(fileInfo => fileInfo.Name, new NaturalSortComparer<string>())) |
E com isso, o nosso problema foi resolvido, onde temos o seguinte resultado:
Muito obrigado pela visita e atĂ© o prĂ³ximo post!