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

Оказывается метод, который возвращает список директорий (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.

  • Yuri Zholobov

    В рамках .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;

  • Yuri Zholobov

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

    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;

  • http://vitiy.info Victor Laskin

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

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

  • Yuri Zholobov

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

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

  • http://vitiy.info Victor Laskin

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

  • http://rodonist.wordpress.com/ SilverCloud

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