Ответ 1
Лучший подход - использовать IComparer
. Это уже сделано и может быть найдено в проекте кода.
У меня есть список вроде этого:
var l = new List<string> {"bla 1.txt","bla 2.txt","bla 10.txt","bla 3.txt"};
Если я вызываю l.Sort(), список сортируется в порядке 1,10,2,3, что имеет смысл с чистой строки точки зрения, но отстой из пользовательской перспективы.
Так как я не хочу/не могу заставить своих пользователей называть их 01, 02, 03,... Интересно, есть ли встроенный метод или простой алгоритм для обнаружения и сортировки чисел должным образом, так что у меня 1,2,3,10? Поскольку числа имеют длину всего 1 или 2 символа (т.е. Не более 99), я мог бы сделать регулярное выражение, которое временно префиксно всех 1-значных чисел с 0 и сортировкой, но прежде чем я изобретаю колесо, я задаюсь вопросом, что-то уже существует
.net 3.5SP1, если это важно, а не 4.0
Лучший подход - использовать IComparer
. Это уже сделано и может быть найдено в проекте кода.
Почему бы не написать что-нибудь, что выберет номер из строки, например?
// Note: This could very well be a bad implementation. I'm not too great with Regex.
static int ExtractNumber(string text)
{
Match match = Regex.Match(text, @"(\d+)");
if (match == null)
{
return 0;
}
int value;
if (!int.TryParse(match.Value, out value))
{
return 0;
}
return value;
}
Затем вы можете отсортировать список, используя:
list.Sort((x, y) => ExtractNumber(x).CompareTo(ExtractNumber(y)));
Это кажется мне довольно неэффективным, но оно должно функционировать как минимум.
Вы можете реализовать свой собственный IComparer, который может использовать регулярное выражение на входе ( "bla 1.txt" ), преобразует его в int и отображает сравнение по этому анализируемому значению.