01.06.08
Сортировка директорий на 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.
В рамках .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;
Упс. Генерик скобки сьелись.
Ещё раз попробую:
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;
второй метод особенно радует глаз
ps. С файлами таже проблема, что и с директориями. Обнаружил что она прекрасно проявляется если работать с флешкой.
Зато во втором методе кроме дефолтного компаратора нельзя ничего сделать. Максимум это orderby d.Name.ToUpper().
p.s. А где хотя бы намекается что GetDirectories() и пр. возвращают в каком-то порядке?
Ну это повседневная практика обращения с этими методами намекает очень настойчиво
и обманывает при этом…
GetDirectories ничего не сортирует, он просто выдаёт список в том виде, в каком директории хранятся в файловой системе. Просто NTFS хранит файлы уже отсортированными по алфавиту (в целях оптимизации скорости поиска), а FAT - в порядке их добавления в родительскую директорию. Другими словами (как это ни странно), NTFS лишена части возможностей FAT’а