我有一个文件夹名称列表,这些文件夹名称表示规范中的章节,子章节,节,段落和行。这些文件夹的一小部分示例如下所示。
我需要编写一个将这些数字排序并考虑层次嵌套的函数。例如,上面的排序将是正确的输出。
由于这与版本号的排序方式基本相同,因此我尝试了以下代码,直到尝试处理包含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')
如果在数字之间添加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