Сортировка массива имен папок как Windows Explorer (Численно и В алфавитном порядке) - VB.NET

Я уничтожаю меня и обезвоживаю попытку получить этот массив к виду.

У меня есть массив, содержащий каталоги, сгенерированные;

Тусклые папки () как строка = каталог. GetDirectories (RootPath)

Мне нужны они, чтобы быть отсортированным так, они появляются как в Windows Explorer в win7 / перспектива. - численно и в алфавитном порядке именами папок.

Имена папок содержат и буквы и числа, иногда буквы только или числа только.

Простой массив. Вид (Папки) приводит к

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

То, что я хочу иметь (и что Windows Explorer отображает)...

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

Я погуглил и узнал, что класс должен быть записан, который использует IComparable для сортировки элементов. Быть суперновичком... Я действительно не знаю, как это может быть сделано. Большинство примеров, на которые я смотрел, имело многомерные массивы и ключи :S...

было бы еще более хорошим, если сортировка могла бы быть применена к массиву имен файлов (вместо foldernames) или массиву, содержащему и папки и файлы..., в этом случае отсортированные папки появляются в главных и отсортированных файлах ниже... это даже возможное?

Любая справка будет значительно цениться... :D спасибо.

16
задан Norman 26 June 2010 в 13:59
поделиться

2 ответа

Вам нужно реализовать IComparer, в отличие от создания класса, который реализует IComparable. Разница в том, что IComparer имеет необходимые "знания" для сравнения двух объектов, тогда как IComparable реализуется классом, который знает, как сравнить себя с чем-то другим.

А способ, которым Проводник Windows сортирует имена файлов, использует функцию под названием StrCmpLogicalW. Вы можете использовать эту функцию в своем собственном IComparer, чтобы получить такое же поведение сортировки, как в Windows Explorer. Эта функция рассматривает числовые части строк как числа, так что 9 сортируется перед 10.

public class MyComparer : IComparer<string> {

    [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());

И поскольку я только что заметил, что вопрос задан в теге VB... Простите мой ржавый 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
25
ответ дан 30 November 2019 в 21:27
поделиться

Array.Sort также имеет параметр IComparer, вы можете переопределить поведение сортировки, если вам не нравится умолчание. смотрите Метод Array.Sort (T[], IComparer) как это сделать

.
1
ответ дан 30 November 2019 в 21:27
поделиться