Сортировка списка строк численно (1,2, ..., 9,10 вместо 1,10,2) - PullRequest
16 голосов
/ 25 января 2011

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

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), я мог бы сделать регулярное выражение, которое временно префиксирует все однозначные числа с 0 и сортирует, но перед тем, как заново изобрести колесо, мне интересно, существует ли что-то уже?

.net 3.5SP1, если это имеет значение, а не 4.0

Ответы [ 3 ]

20 голосов
/ 25 января 2011

Лучший подход - использовать IComparer. Это уже сделано и может быть найдено в коде проекта .

10 голосов
/ 25 января 2011

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

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

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

0 голосов
/ 25 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...