c#大纲编号

本文关键字:编号 | 更新日期: 2023-09-27 18:10:12

我正在尝试在c#中开发一种算法,该算法可以接受URL的数组列表并以大纲编号列表输出它们。

你可以想象我需要一些帮助。有没有人对生成这个列表的逻辑有任何建议?

示例输出:

1   - http://www.example.com/aboutus
1.2 - http://www.example.com/aboutus/page1
1.3 - http://www.example.com/aboutus/page2
1.3.1   - http://www.example.com/aboutus/page2/page3
1.3.1.1 - http://www.example.com/aboutus/page2/page3/page4
1.3.2   - http://www.example.com/aboutus/page5/page6
1.3.2.1 - http://www.example.com/aboutus/page5/page7/page9
1.3.2.2 - http://www.example.com/aboutus/page5/page8/page10
1.4 - http://www.example.com/aboutus/page10
1.4.1   - http://www.example.com/aboutus/page10/page11
1.4.2   - http://www.example.com/aboutus/page10/page12
1.1.5   - http://www.example.com/aboutus/page13
1.1.6   - http://www.example.com/aboutus/page14
1.1.6.1 - http://www.example.com/aboutus/page14/page15
1.1.6.2 - http://www.example.com/aboutus/page14/page16
1.1.6.3 - http://www.example.com/aboutus/page14/page17

…等等

c#大纲编号

看看这个系统。URI类。它应该有一些有用的方法和属性,比如将uri拆分为其分段部分的segments属性(基本上是用斜杠分割)。您可以创建段数组的列表,对列表进行排序,然后根据当前列表索引段是否与前一个列表索引段匹配,简单地迭代列表来调整数字。

您可能需要剥离协议和查询字符串参数,因此建议使用System.URI类来处理。

至于打印成树形-一个直接的方法是使用Dictionary<string, string>来保持子(键)与父(值)的关联。

另一种方法是利用List<T>.Sort,例如:

public static void Print(List<string> list)
{
    var path = new Stack<string>();
    var count = new Stack<int>();
    path.Push("");
    count.Push(0);
    list.Sort(new Comparison<string>(UrlComparison));
    foreach (var x in list)
    {
        while (!x.StartsWith(path.Peek())) { path.Pop(); count.Pop(); }
        count.Push(count.Pop() + 1);
        foreach(var n in count.Reverse()) Console.Write("{0}.", n);
        Console.WriteLine(" {0}", x);
        path.Push(x);
        count.Push(0);
    }
}

不幸的是,p.campbell是正确的,这里实际上需要一个自定义比较,这使得这个实现仍然非常性能,但更笨重(?:-abuse警告):

public static int UrlComparison(string x, string y)
{
    if (x == null && y == null) return 0;
    if (x == null) return -1;
    if (y == null) return 1;
    for(int n = 0; n < Math.Min(x.Length, y.Length); n++)
    {
        char cx = x[n], cy = y[n];
        if(cx == cy) continue;
        return
            (cx == '/' || cx == '.' || cx == '?') ? -1 :
            (cy == '/' || cy == '.' || cy == '?') ? 1 :
            (cx > cy) ? 1 : -1;
    }
    return (x.Length == y.Length) ? 0 : (x.Length > y.Length) ? 1 : -1;
}

PS:先声明一下,我觉得stack的逻辑很简单,但是理解起来有点复杂。在长期项目中,我会坚持使用child-parent字典。

也许这个通用树集合会有帮助。

Code Project中有几个树集合:一个,两个。

我认为您需要实现某种树集合来处理订单。因为如果你添加一个新的链接http://www.example.com,它就会变成1而不是http://www.example.com/aboutus。

然后可以打印树的顺序遍历,这将非常简单。