В 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);
}
}