Попробуйте написать небольшой вспомогательный класс для разбора и представления ваших токенов. Например, без слишком большого количества проверок:
public class NameAndNumber
{
public NameAndNumber(string s)
{
OriginalString = s;
Match match = Regex.Match(s,@"^(.*?)(\d*)$");
Name = match.Groups[1].Value;
int number;
int.TryParse(match.Groups[2].Value, out number);
Number = number; //will get default value when blank
}
public string OriginalString { get; private set; }
public string Name { get; private set; }
public int Number { get; private set; }
}
Теперь становится проще записывать компаратор или сортировать его вручную:
var list = new List<string> { "ABC", "1", "5", "NUM44", "3",
"6", "11", "9", "NUM1", "NUM0" };
var sorted = list.Select(str => new NameAndNumber(str))
.OrderBy(n => n.Name)
.ThenBy(n => n.Number);
Дает результат:
1, 3, 5, 6, 9, 11, ABC, NUM0, NUM1, NUM44
blockquote>