Warm tip: This article is reproduced from serverfault.com, please click

sorting-由定界整数(C#)制成的字符串的层次结构和数字顺序

(sorting - Hierarchical and numerical ordering of strings made from delimited integers (C#))

发布于 2020-11-25 22:02:07

我有一个文件夹名称列表,这些文件夹名称表示规范中的章节,子章节,节,段落和行。这些文件夹的一小部分示例如下所示。

  • 1_1_1
  • 1_1_12
  • 1_1_2
  • 1_2_1
  • 1_2_1_3_1
  • 1_2_2

我需要编写一个将这些数字排序并考虑层次嵌套的函数。例如,上面的排序将是正确的输出。

  1. 1_1_1
  2. 1_1_2
  3. 1_1_12
  4. 1_2_1
  5. 1_2_1_3_1
  6. 1_2_2

由于这与版本号的排序方式基本相同,因此我尝试了以下代码,直到尝试处理包含4个以上部分(即1_2_1_3_1)的输入为止,

private List<Resource> OrderResources(List<Resource> list)
    {
        return list.OrderBy(v => System.Version.Parse(v.Id.Replace('_', '.'))).ToList();
    }

我得到的错误是

System.ArgumentException : Version string portion was too short or too long. (Parameter 'input')
Questioner
Rob S.
Viewed
0
Stanislav 2020-11-26 06:57:39

如果在数字之间添加n个字符0,则可以进行排序。

另外,你可以使用长号并将数字n位向左移动,但是数字的长度会受到限制。

static void Main(string[] args)
{
    var chapter = new List<string>();
    chapter.Add("1_1_1");
    chapter.Add("1_1_12");
    chapter.Add("1_1_2");
    chapter.Add("1_2_1");
    chapter.Add("1_2_1_3_1");
    chapter.Add("1_2_2");
    var result = chapter.OrderBy(x=>SortCalc(x)).ToArray();
    foreach (var s in result)
    {
        Console.WriteLine($"{s}->{SortCalc(s)}");
    }
}

private static string SortCalc(string x, int count = 3)
{
    var array = x.Split('_').ToList();
    
    for (var index = 0; index < array.Count; index++)
    {
        var length = count - array[index].Length;
        if (length <=0)
            continue;
        array[index] = new string('0', length)+ array[index];
    }

    var num = string.Join("", array);
    return num;
}

输出将是

1_1_1->001001001
1_1_2->001001002
1_1_12->001001012
1_2_1->001002001
1_2_1_3_1->001002001003001
1_2_2->001002002