2010-08-30 76 views
0

我想做出一個方法來生成一個層次ID像下面如何創建一個層次ID

 
1.0 
1.1 
    1.1.1 
    1.1.2 
    1.1.3 

1.2 
1.3 
2.0 
2.1 

是存在的方式來做到這一點? 任何幫助將不勝感激。

+0

你只需要輸出現有的層次?大多數圖表已經具有層次結構,所以你的問題不是很清楚。 – Oded 2010-08-30 11:33:51

+0

一些嵌套for循環或與某種停止條件配對的遞歸函數將爲您解決此問題。你應該詳細說明你的問題。提一下你會給出什麼樣的輸入(級別,停止條件?)以及如何格式化輸出(列表,空格分隔字符串,帶鏈接的html代碼?)。你會一次獲得一個價值嗎? – 2010-08-30 11:35:36

+0

感謝您的回覆 只是我想生成這個ID爲每個新元素 我有一個父母的孩子關係,我需要用每個孩子的父母身份+孩子ID 假設父母身份是「1」所以我需要通過以下方式產生所有的孩子給這位家長 第一個孩子ID 1.1 第二個孩子ID 1.2 第三個孩子ID 1.3 和所有的孩子可能父母給其他孩子,假設冷杉孩子也有一個孩子,所以新的ID應如下 第一個孩子的ID應該是1.1.1 第二個孩子的ID應該是1.1.2 等等。 和輸入將是父母ID它可能是1或2或3 – Cracker 2010-08-30 11:44:35

回答

3

這是我的快速嘗試。

我假設,而不是1.02.0分別意味着12,否則它會不一致。

public class HierarchyGenerator 
{ 
    private List<int> levels = new List<int> { 1 }; 

    public void DownOneLevel() 
    { 
     levels.Add(1); 
    } 

    public void UpLevels(int numLevels) 
    { 
     if (levels.Count < numLevels + 1) 
      throw new InvalidOperationException(
       "Attempt to ascend beyond the top level."); 

     for (int i = 0; i < numLevels; i++) 
      levels.RemoveAt(levels.Count - 1); 
     MoveNext(); 
    } 

    public void MoveNext() 
    { 
     levels[levels.Count - 1]++; 
    } 

    public string Current 
    { 
     get 
     { 
      return new string(' ', (levels.Count - 1) * 2) 
       + string.Join(".", levels.Select(l => l.ToString())); 
     } 
    } 
} 

static partial class Program 
{ 
    static void Main() 
    { 
     var hg = new HierarchyGenerator(); 
     Console.WriteLine(hg.Current); // 1 
     hg.DownOneLevel(); 
     Console.WriteLine(hg.Current); // 1.1 
     hg.DownOneLevel(); 
     Console.WriteLine(hg.Current); // 1.1.1 
     hg.MoveNext(); 
     Console.WriteLine(hg.Current); // 1.1.2 
     hg.MoveNext(); 
     Console.WriteLine(hg.Current); // 1.1.3 
     hg.UpLevels(1); 
     Console.WriteLine(hg.Current); // 1.2 
     hg.MoveNext(); 
     Console.WriteLine(hg.Current); // 1.3 
     hg.UpLevels(1); 
     Console.WriteLine(hg.Current); // 2 
     hg.DownOneLevel(); 
     Console.WriteLine(hg.Current); // 2.1 
    } 
} 
+0

謝謝蒂米,這正是我所需要的 – Cracker 2010-08-30 11:58:44

2

我假設你的層次表現就像一棵樹一樣使用這個類:

class Node { 
    public Node() { Children = new Node[0]; } 
    public String Name { get; set; } 
    public IEnumerable<Node> Children { get; set; } 
} 

然後,您可以使用此方法訪問樹中的每個節點該代碼將以深入的第一順序訪問樹中的每個節點,包括根。但是,根將有一個空的hierarchyId。要開始訪問樹,請使用以下代碼:

Visit(
    root, 
    new Stack<int>(), 
    (node, hierarchyId) => Console.WriteLine(hierarchyId + ": " + node.Name) 
); 

該操作將簡單地將節點名稱和生成的層次結構id寫入控制檯。

下面是一些樣本數據:

var root = new Node { 
    Name = "Root", 
    Children = new[] { 
    new Node { 
     Name = "A", 
     Children = new[] { 
     new Node { 
      Name = "AA", 
      Children = new [] { 
      new Node { Name = "AAA" }, 
      new Node { Name = "AAB" }, 
      new Node { Name = "AAC" } 
      } 
     }, 
     new Node { Name = "AB" }, 
     new Node { Name = "AC" } 
     } 
    }, 
    new Node { 
     Name = "B", 
     Children = new Node[] { 
     new Node { Name = "BA" } 
     } 
    } 
    } 
}; 

運行在這棵樹的代碼寫入以下控制檯:

: Root 
1: A 
1.1: AA 
1.1.1: AAA 
1.1.2: AAB 
1.1.3: AAC 
1.2: AB 
1.3: AC 
2: B 
2.1: BA