Classificando uma matriz de nomes de pastas como o Windows Explorer (Numericamente e Alfabeticamente) – VB.NET

Estou me matando e desidratando tentando fazer com que esse array seja ordenado.

Eu tenho uma matriz contendo diretórios gerados por;

Dim Folders () As String = Directory.GetDirectories (RootPath)

Eu preciso que eles sejam classificados para que eles apareçam no windows explorer no win7 / vista. – numericamente e alfabeticamente por nomes de pastas.

Os nomes das pastas contêm letras e números, às vezes apenas letras ou apenas números.

O simples Array.Sort (Folders) resulta em

C:\inetpub\wwwroot\rootpath\1 C:\inetpub\wwwroot\rootpath\10 C:\inetpub\wwwroot\rootpath\100 C:\inetpub\wwwroot\rootpath\1004 C:\inetpub\wwwroot\rootpath\101 C:\inetpub\wwwroot\rootpath\11 C:\inetpub\wwwroot\rootpath\12 C:\inetpub\wwwroot\rootpath\2 C:\inetpub\wwwroot\rootpath\3 C:\inetpub\wwwroot\rootpath\4 C:\inetpub\wwwroot\rootpath\5 C:\inetpub\wwwroot\rootpath\6 C:\inetpub\wwwroot\rootpath\7 C:\inetpub\wwwroot\rootpath\8 C:\inetpub\wwwroot\rootpath\87skjnd C:\inetpub\wwwroot\rootpath\89sdf93kmw3 C:\inetpub\wwwroot\rootpath\9 C:\inetpub\wwwroot\rootpath\ad C:\inetpub\wwwroot\rootpath\bin C:\inetpub\wwwroot\rootpath\dark C:\inetpub\wwwroot\rootpath\erk C:\inetpub\wwwroot\rootpath\jkh23978yoaslkd3 C:\inetpub\wwwroot\rootpath\lk2309as C:\inetpub\wwwroot\rootpath\work C:\inetpub\wwwroot\rootpath\zone 

O que eu quero ter (e o que o Windows Explorer exibe) é …

 C:\inetpub\wwwroot\rootpath\1 C:\inetpub\wwwroot\rootpath\2 C:\inetpub\wwwroot\rootpath\3 C:\inetpub\wwwroot\rootpath\4 C:\inetpub\wwwroot\rootpath\5 C:\inetpub\wwwroot\rootpath\6 C:\inetpub\wwwroot\rootpath\7 C:\inetpub\wwwroot\rootpath\8 C:\inetpub\wwwroot\rootpath\9 C:\inetpub\wwwroot\rootpath\10 C:\inetpub\wwwroot\rootpath\11 C:\inetpub\wwwroot\rootpath\12 C:\inetpub\wwwroot\rootpath\87skjnd C:\inetpub\wwwroot\rootpath\89sdf93kmw3 C:\inetpub\wwwroot\rootpath\100 C:\inetpub\wwwroot\rootpath\101 C:\inetpub\wwwroot\rootpath\1004 C:\inetpub\wwwroot\rootpath\ad C:\inetpub\wwwroot\rootpath\bin C:\inetpub\wwwroot\rootpath\dark C:\inetpub\wwwroot\rootpath\erk C:\inetpub\wwwroot\rootpath\jkh23978yoaslkd3 C:\inetpub\wwwroot\rootpath\lk2309as C:\inetpub\wwwroot\rootpath\work C:\inetpub\wwwroot\rootpath\zone 

Eu pesquisei e descobri que uma class precisa ser escrita que usa IComparable para classificar os elementos. Ser super novato … Eu realmente não sei como isso pode ser feito. A maioria dos exemplos que eu olhei tinha matrizes e chaves multi-dimensionais: S …

seria ainda melhor se a sorting pudesse ser aplicada a uma matriz de nomes de arquivos (em vez de nomes de pastas) ou a uma matriz contendo pastas e arquivos … nesse caso, as pastas classificadas aparecem nos arquivos principais e classificados abaixo … mesmo possível?

Qualquer ajuda será muito appriciated …: D obrigado.

Você precisaria implementar um IComparer, em vez de criar uma class que implementa IComparable. A diferença é que um IComparer possui o “conhecimento” necessário para comparar dois objects, enquanto o IComparable é implementado por uma class que sabe como se comparar com outra coisa.

E o modo como o Windows Explorer classifica nomes de arquivos está usando uma function chamada StrCmpLogicalW . Você pode usar essa function em seu próprio IComparer para obter o mesmo comportamento de sorting do Windows Explorer. Esta function trata partes numéricas de strings como números, de modo que 9 classifica antes de 10.

 public class MyComparer : IComparer { [DllImport("shlwapi.dll", CharSet=CharSet.Unicode, ExactSpelling=true)] static extern int StrCmpLogicalW(String x, String y); public int Compare(string x, string y) { return StrCmpLogicalW(x, y); } } Array.Sort(unsortedNames, new MyComparer()); 

E desde que eu notei que a pergunta é marcada VB … Perdoe meu VB enferrujado!

 Public Class MyComparer Implements IComparer(Of String) Declare Unicode Function StrCmpLogicalW Lib "shlwapi.dll" ( _ ByVal s1 As String, _ ByVal s2 As String) As Int32 Public Function Compare(Byval x as String, Byval y as String) As Integer _ Implements System.Collections.Generic.IComparer(Of String).Compare Return StrCmpLogicalW(x, y) End Function End Class 

Array.Sort tem um parâmetro IComparer também, você pode replace o comportamento de sorting se você não gostar do padrão. veja o método Array.Sort (T [], IComparer) como fazer