BillWoodruff
1 Вы получаете эти имена файлов из перечисления каталогов с помощью ?
2 пробовали ли вы использовать метод EnumerateFiles .NET 4 ?
3 пробовали ли вы использовать сортировку Linq с помощью OrderBy/Ascending/Descending ?
Более сложный способ справиться с этим-использовать 'SortedDictionary с пользовательским компаратором: приведенный здесь пример использует тот факт, что числовые последовательности символов не в конце строки сортируются в нужном порядке; только когда числовые символы находятся в начале строки, вам нужно сравнивать в "обратном порядке"."
public class SortFilesComparer : IComparer<string>
{
public int Compare(string fname1, string fname2)
{
// number at the start of file name 1 ?
var num1 = fname1.TakeWhile(char.IsDigit);
if (num1.Count() != 0)
{
// number at the start of file name 2 ?
var num2 = fname2.TakeWhile(char.IsDigit);
if (num2.Count() != 0)
{
// we'll need both string and int
string n1s = new string(num1.ToArray());
string n2s = new string(num2.ToArray());
int n1 = Convert.ToInt32(n1s);
int n2 = Convert.ToInt32(n2s);
// voodoo !
if (n1s.Contains(n2s))
{
if (n1 > n2)
{
return fname2.CompareTo(fname1);
}
}
else if (n2s.Contains(n1s))
{
if (n1 < n2)
{
return fname2.CompareTo(fname1);
}
}
}
}
return fname1.CompareTo(fname2);
}
}
Пример использования:
SortedDictionary<string, string> sd = new SortedDictionary<string, string>(new SortFilesComparer());
sd.Add("234hello", "3");
sd.Add("234567hello", "4");
sd.Add("1234567hello", "4");
sd.Add("hello 1", "2");
sd.Add("hello 10", "1");
sd.Add("100hello", "3");
sd.Add("101hello", "4");
sd.Add("10hello", "3");
sd.Add("1hello", "4");
sd.Add("hell10", "5");
sd.Add("hell1", "6");
Запустите код и изучите элементы 'sd.
Примечание: это было написано быстро, и, хотя все в порядке с этими тестовыми значениями, должно быть тщательно протестировано.
Мне не очень нравится, насколько сложен этот код, и есть один случай, с которым он не справляется ... можете ли вы догадаться, что это такое :)