2011-09-30 58 views
6

我想在C#中開發一個算法,它可以獲取URL的數組列表並將它們輸出到大綱編號列表中。c#大綱編號

你可以想象我需要一些幫助。有沒有人有任何建議用於生成此列表的邏輯?

輸出示例:

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 

...等等

+0

嗨,1.3.2和1.3.2.1中是否有小故障?我會打電話給第二個1.3.3.1 - 是嗎? – Carsten

+2

爲什麼這個>> 1.1.5 - http:// www.example.com/aboutus/page13' ?.爲什麼不是'1.5'? – Nawaz

+1

列表最初是按您想要編號的順序排序的嗎?爲什麼'http:// www.example.com/aboutus/aboutus'不是1.1? –

回答

3

您可能不得不去掉協議和查詢字符串參數,所以+1建議使用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:剛放一個免責聲明,我覺得Stacks邏輯是consize,但有點複雜的理解。在一個長期項目中,我會堅持使用一個兒童父母字典。

+1

優秀的開始!一個尼特:排序是最新的,它[將[Page10]排序到「Page1」下面)(http://i.imgur.com/5Vnzf.png) –

+0

@ p.campbell好點!我已經添加了自定義的排序比較。 –

+0

謝謝DK。這正是我需要的! – Steve

8

看看System.URI類。它應該有一些應該有用的方法和適當的東西,比如將uri分割成它的分割部分的segment屬性(基本上用斜槓分割)。您可以創建分段數組的列表,對列表進行排序,然後簡單地迭代列表,根據當前列表索引段與先前列表索引段的匹配情況調整數字。