C#. Как правильно получить список файлов из папки в нужном порядке?
В 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);
    }
}
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')));
}