@TechNOIR

C#. Как правильно получить список файлов из папки в нужном порядке?

Всем привет!

Вопрос на засыпку...

Получаю список файлов из папки.
Пробовал и так
var testFiles = Directory.EnumerateFiles(solutionDirectory + @"\samples");

и так
about-windows.ru/programmirovanie/programmirovanie...

Получаю в таком порядке:
1.jpg
2.jpg
3.jpg
4.jpg
5.jpg
6.jpg
6721086-1.jpg
6721086-2.jpg
6721086-3.jpg
7.jpg
8.jpg
9.jpg


А в папке они в таком порядке:
5c63433acb249974285671.png

Вот как получит именно в таком порядке как на картинке?
Спасибо заранее
  • Вопрос задан
  • 1606 просмотров
Решения вопроса 1
lexxpavlov
@lexxpavlov
Программист, преподаватель
В Windows уже есть готовая функция, которая выполняет натуральное сравнение строк, лучше использовать её. Эта функция разбивает строку на числовые и строковые части и ищет эти части друг с другом, причём числовые части сравнивает как числа, а строковые - алфавитно.

var testFiles = Directory.EnumerateFiles(solutionDirectory + @"\samples");

var sortedTestFiles1 = testFiles.OrderBy(x => x, new NaturalComparer());
// или
var sortedTestFiles2 = testFiles.ToList();
sortedTestFiles2.Sort(new NaturalComparer());

/// <summary>
/// Натуральное сравнение строк
/// </summary>
public class NaturalComparer : IComparer<string>
{
    /// <summary>
    /// Вызов WinApi-функции для натурального сравнения строк
    /// </summary>
    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
    private static extern int StrCmpLogicalW(string psz1, string psz2);

    /// <summary>
    /// Натуральное сравнение строк
    /// </summary>
    /// <param name="x">Первая строка</param>
    /// <param name="y">Вторая строка</param>
    /// <returns>Сравнивает две строки, возвращая -1, 0 или 1</returns>
    public static int Compare(string x, string y)
    {
        return StrCmpLogicalW(x, y);
    }

    /// <summary>
    /// Натуральное сравнение строк
    /// </summary>
    /// <param name="x">Первая строка</param>
    /// <param name="y">Вторая строка</param>
    /// <returns>Сравнивает две строки, возвращая -1, 0 или 1</returns>
    int IComparer<string>.Compare(string x, string y)
    {
        return StrCmpLogicalW(x, y);
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@kttotto
пофиг на чем писать
То, как Вы видите файлы в папке, сортирует проводник и вовсе не говорит о том, как они хранятся или в каком порядке добавлялись в папку. Если хотите увидеть в том же порядке, что и в проводнике, то и результат сортируйте по тем же параметрам
testFiles.OrderBy(f => f.Name)
Ответ написан
Комментировать
Alexeytur
@Alexeytur
C# сортирует строки лексикографически, а проводник использует Natural Sort. Вот что за минуту нагуглил по Natural Sort в C#:
public static IOrderedEnumerable<T> OrderByAlphaNumeric<T>(this IEnumerable<T> source, Func<T, string> selector)
{
    int max = source
        .SelectMany(i => Regex.Matches(selector(i), @"\d+").Cast<Match>().Select(m => (int?)m.Value.Length))
        .Max() ?? 0;

    return source.OrderBy(i => Regex.Replace(selector(i), @"\d+", m => m.Value.PadLeft(max, '0')));
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы