Сортировка списка строк численно (1,2,..., 9,10 вместо 1,10,2)

У меня есть список вроде этого:

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

Ответы

Ответ 2

Почему бы не написать что-нибудь, что выберет номер из строки, например?

// 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)));

Это кажется мне довольно неэффективным, но оно должно функционировать как минимум.

Ответ 3

Вы можете реализовать свой собственный IComparer, который может использовать регулярное выражение на входе ( "bla 1.txt" ), преобразует его в int и отображает сравнение по этому анализируемому значению.