Как отсортировать массив строк по числовому стилю? - PullRequest
5 голосов
/ 17 июля 2011

У меня есть массив имен файлов, я хочу отсортировать его по числовому стилю, пожалуйста, дайте мне решение.

Example1:

Исходный массив: [name99.txt, name98.txt, name100.txt]
Сортированный массив: [name98.txt, name99.txt, name100.txt]
(При использовании сортировки строк результат сортировки [name100.txt, name98.txt, name99.txt])

Example2:

Исходный массив: [a99.txt, b98.txt, b100.txt]
Сортированный массив: [a99.txt, b98.txt, b100.txt]
(При использовании сортировки строк результат сортировки [a99.txt, b100.txt, b99.txt])

Ответы [ 3 ]

8 голосов
/ 17 июля 2011
string[] ar = new string[] { "name99.txt", "name98.txt", "name100.txt" };
Array.Sort(ar, (a, b) => int.Parse(Regex.Replace(a, "[^0-9]", "")) - int.Parse(Regex.Replace(b, "[^0-9]", "")));

foreach (var a in ar)
    Console.WriteLine(a);

Выше предполагалось, что ваши файлы всегда называются name###.txt.Для настоящей числовой сортировки используйте следующую более сложную версию:

public static void NumericalSort(string[] ar)
{
    Regex rgx = new Regex("([^0-9]*)([0-9]+)");
    Array.Sort(ar, (a, b) =>
    {
        var ma = rgx.Matches(a);
        var mb = rgx.Matches(b);
        for (int i = 0; i < ma.Count; ++i)
        {
            int ret = ma[i].Groups[1].Value.CompareTo(mb[i].Groups[1].Value);
            if (ret != 0)
                return ret;

            ret = int.Parse(ma[i].Groups[2].Value) - int.Parse(mb[i].Groups[2].Value);
            if (ret != 0)
                return ret;
        }

        return 0;
    });
}

static void Main(string[] args)
{
    string[] ar = new string[] { "a99.txt", "b98.txt", "b100.txt" };

    NumericalSort(ar);

    foreach (var a in ar)
        Console.WriteLine(a);
}
4 голосов
/ 17 июля 2011

Для этого вполне может существовать управляемый способ, но я бы, вероятно, просто вызвал P / StrCmpLogicalW.

[DllImport("shlwapi.dll", CharSet=CharSet.Unicode, ExactSpelling=true)]
static extern int StrCmpLogicalW(String x, String y);    

Если вы используете эту функцию, вместо того, чтобы использовать собственную функцию сравнения, вы получите то же поведение, что и в Проводнике и других компонентах системы, использующих логическое сравнение.

Обратите внимание, однако, что это не будет работать в средах, где WinAPI недоступен (например, Windows Phone, Mono или Silverlight), может работать по-разному в разных системах и должно быть отмечено комментарием, поэтому будущий сопровождающий вашего кода знает, почему для сортировки используется P / Invoke.

1 голос
/ 17 июля 2011

Одно решение можно найти здесь: Буквенно-цифровая сортировка

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