Допустим, я отсортировал список файлов в проводнике по имени, например:
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 #, но мне еще предстоит найти способ. Любая помощь приветствуется!
Благодарность!
4 ответа
Проводник Windows использует API под названием:
StrCmpLogicalW
Выполнить сортировку "логическим" способом.
Кто-то также реализовал класс на C #, который сделает это за вас.
Иногда, в зависимости от данных, вы можете просто сделать это:
using System.Linq;
...
string[] dirs = _fileSystem.GetDirectories(_root);
dirs = dirs.OrderBy(x => x.Length).ThenBy(x => x);
Это работает с образцами данных, указанными в вашем вопросе.
Вам нужна натуральная числовая сортировка, которой, к сожалению, нет собственной реализации в .NET framework. Эта статья на CodeProject расскажет вам все, что вам нужно знать о создании собственного Клон .NET.
Вы также можете использовать P / Invoke для вызова Win32 API. Это было бы наиболее последовательным поведением и могло бы работать лучше (я бы проверил оба варианта). Даже ссылка на проект кода не полностью соответствует поведению Windows и не является гарантией будущего.
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.