Допустим, я отсортировал список файлов в проводнике по имени, например:

2009-06-02-4.0.9.txt
2009-06-02-4.0.10.txt
2009-06-02-4.0.11.txt
2009-06-02-4.0.12.txt

У меня есть FileInfo Comparer, который сортирует массив объектов FileInfo по имени:

    class FileInfoComparer : IComparer<FileInfo> {
        public int Compare(FileInfo x, FileInfo y) {
            return string.Compare(x.FullName, 
                                  y.FullName, 
                                  StringComparison.OrdinalIgnoreCase);
        }
    }

Сортировка того же списка файлов сверху с помощью этого Comparer дает:

2009-06-02-4.0.10.txt
2009-06-02-4.0.11.txt
2009-06-02-4.0.12.txt
2009-06-02-4.0.9.txt

Что проблематично, так как порядок чрезвычайно важен.

Я мог бы предположить, что есть способ имитировать то, что делает Windows в коде C #, но мне еще предстоит найти способ. Любая помощь приветствуется!

Благодарность!

3
Mark Carpenter 18 Июн 2009 в 18:34

4 ответа

Лучший ответ

Проводник Windows использует API под названием:

StrCmpLogicalW

Выполнить сортировку "логическим" способом.

Кто-то также реализовал класс на C #, который сделает это за вас.

11
Jon Grant 19 Окт 2013 в 12:28

Иногда, в зависимости от данных, вы можете просто сделать это:

using System.Linq;         
...

    string[] dirs = _fileSystem.GetDirectories(_root);
    dirs = dirs.OrderBy(x => x.Length).ThenBy(x => x);

Это работает с образцами данных, указанными в вашем вопросе.

0
JBrooks 23 Май 2020 в 21:43

Вам нужна натуральная числовая сортировка, которой, к сожалению, нет собственной реализации в .NET framework. Эта статья на CodeProject расскажет вам все, что вам нужно знать о создании собственного Клон .NET.

2
Martin Harris 18 Июн 2009 в 14:44

Вы также можете использовать P / Invoke для вызова Win32 API. Это было бы наиболее последовательным поведением и могло бы работать лучше (я бы проверил оба варианта). Даже ссылка на проект кода не полностью соответствует поведению Windows и не является гарантией будущего.

3
marr75 18 Июн 2009 в 14:55