01.06.08

Сортировка директорий на C#

Tags: .Net 2.0, Программирование / 4:18 pm , Victor Laskin

Оказывается метод, который возвращает список директорий (GetDirectories) иногда может их не сортировать. Вроде как это происходит на винтах под FATом. Поэтому если Вы где-то визуализируете список директорий, то рекомендую Вам вставить туда алгоритм ручной сортировки, ибо сделать это легко с помощью Array.Sort:

DirectoryInfo[] dirs = dir.GetDirectories();

        

//Сортировочка:

Array.Sort(dirs, 0, dirs.Length, new DirectorySort());

Сам принцип сортировки нужно оформить ввиде класса реализующего интерфейс IComparer:

  class DirectorySort : System.Collections.IComparer

  {

    public int Compare(object x, object y)

    {

      DirectoryInfo d1 = x as DirectoryInfo;

      DirectoryInfo d2 = y as DirectoryInfo;

      return String.Compare(d1.Name, d2.Name, true, CultureInfo.CurrentCulture);

    }

  }

 

Сортировка тут не различает заглавные-прописные буквы и учитывает CurrentCulture.

6 Comments »

  1. Yuri Zholobov said,
    June 4, 2008 at 7:59 pm

    В рамках .NET 3.5 можно сделать еще двумя способами, один гибче и элегантней другого. :)

    DirectoryInfo[] dirs1 = dir.GetDirectories().OrderBy(
    di => di.Name, StringComparer.Create(CultureInfo.CurrentCulture, true)).ToArray();

    IOrderedEnumerable dirs2 =
    from d in dir.GetDirectories() orderby d.Name select d;

  2. Yuri Zholobov said,
    June 4, 2008 at 8:01 pm

    Упс. Генерик скобки сьелись. :( Ещё раз попробую:

    DirectoryInfo[] dirs1 = dir.GetDirectories().OrderBy<DirectoryInfo, string>(
    di => di.Name, StringComparer.Create(CultureInfo.CurrentCulture, true)).ToArray();

    var dirs2 = from d in dir.GetDirectories() orderby d.Name select d;

  3. Victor Laskin said,
    June 4, 2008 at 9:32 pm

    второй метод особенно радует глаз

    ps. С файлами таже проблема, что и с директориями. Обнаружил что она прекрасно проявляется если работать с флешкой.

  4. Yuri Zholobov said,
    June 5, 2008 at 9:06 pm

    Зато во втором методе кроме дефолтного компаратора нельзя ничего сделать. Максимум это orderby d.Name.ToUpper().

    p.s. А где хотя бы намекается что GetDirectories() и пр. возвращают в каком-то порядке?

  5. Victor Laskin said,
    June 5, 2008 at 10:31 pm

    Ну это повседневная практика обращения с этими методами намекает очень настойчиво ;) и обманывает при этом…

  6. SilverCloud said,
    October 11, 2008 at 10:12 am

    GetDirectories ничего не сортирует, он просто выдаёт список в том виде, в каком директории хранятся в файловой системе. Просто NTFS хранит файлы уже отсортированными по алфавиту (в целях оптимизации скорости поиска), а FAT - в порядке их добавления в родительскую директорию. Другими словами (как это ни странно), NTFS лишена части возможностей FAT’а :-)

Leave a Comment

Or use your OpenID:

Информация для блогоспаммеров - не тратьте свое время, все спам комментарии все равно будут удалены.