如何按数字样式对字符串数组进行排序?

hun*_*m06 5 c# arrays sorting string

我有一个文件名数组,我想按数字样式排序,请给我一个解决方案.

例1:

原始数组:[name99.txt, name98.txt, name100.txt]
排序数组:( [name98.txt, name99.txt, name100.txt]
使用字符串排序,排序结果是[name100.txt, name98.txt, name99.txt])

例2:

原始数组:[a99.txt, b98.txt, b100.txt]
排序数组:( [a99.txt, b98.txt, b100.txt]
使用字符串排序,排序结果是[a99.txt, b100.txt, b99.txt])

Pet*_*nov 8

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);
Run Code Online (Sandbox Code Playgroud)

以上假设您的文件被调用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);
}
Run Code Online (Sandbox Code Playgroud)

  • @大卫:是的,我是一个挑剔的人。有时这会导致答案得到改进,我想这就是在 StackExchange 上发表评论的目的。在我看来,一个完美的答案将包含一个名为“FilenameComparer”的“IComparer”实现,其中包含此代码。这将证明既易于维护又稳定。 (2认同)