Ordenando una matriz de nombres de carpeta como Windows Explorer (numérica y alfabéticamente) – VB.NET

Me estoy matando y deshidratando tratando de ordenar este arreglo.

Tengo una matriz que contiene directorios generados por;

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

Necesito que estén ordenados para que aparezcan como en Windows Explorer en win7 / vista. – numérica y alfabéticamente por nombres de carpeta.

Los nombres de las carpetas contienen letras y números, a veces solo letras o números.

Los resultados simples Array.Sort (Carpetas) en

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 

Lo que quiero tener (y lo que Windows Explorer muestra) es …

 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 

Busqué en Google y descubrí que se debe escribir una clase que use IComparable para ordenar los elementos. Siendo una supernova … Realmente no sé cómo se puede hacer. La mayoría de los ejemplos que miré tenían matrices y claves multidimensionales: S …

sería aún mejor si la clasificación se pudiera aplicar a una matriz de nombres de archivos (en lugar de nombres de carpetas) o una matriz que contenga tanto carpetas como archivos … en cuyo caso las carpetas ordenadas aparecen en la parte superior y los archivos ordenados a continuación … incluso posible?

Cualquier ayuda será muy apreciada …: D gracias.

Debería implementar un IComparer, en lugar de crear una clase que implemente IComparable. La diferencia es que un IComparer tiene el “conocimiento” necesario para comparar dos objetos, mientras que IComparable es implementado por una clase que sabe cómo compararse con otra cosa.

Y la forma en que el Explorador de Windows ordena los nombres de archivos está utilizando una función llamada StrCmpLogicalW . Puede usar esta función en su propio IComparer para obtener el mismo comportamiento de clasificación que Windows Explorer. Esta función trata las partes numéricas de las cadenas como números, de modo que 9 ordena 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()); 

Y como acabo de notar que la pregunta está etiquetada como VB … ¡Perdona mi oxidado VB!

 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 también tiene un parámetro IComparer, puede anular el comportamiento de clasificación si no le gusta el valor predeterminado. ver Método Array.Sort (T [], IComparer) cómo hacerlo