2012-08-09 109 views
-2

假設我們有一個Windows應用程序,它具有一個TreeView,並且可以展開此視圖的節點並深入到子節點,它們也可以有更多的子節點,所以現在我們可以擴展該節點並進一步等等。所以在我的源代碼中,我有一個方法Foo(string fatherNode)獲取我們點擊的父節點並找到子節點並列出它們:獲取父子關係

此方法的高級主體是這樣的:

private void Foo(string fatherNode) 
{ 
    // call some DB scripts and grab data you need to work with. 
    int numberOfKids = // get it from the thing you populated from the DB call. 
    for(int i = 1 to numberOfKids) 
    { 
    Node Child = // grab child[i] from the list we populated from DB calls 
    //Add it to the treeView 
    } 
} 

那麼,代碼是一個UI應用程序,我們點擊一​​個節點,它運行此方法一次,並收集它需要的數據,現在我需要編寫另一種方法,利用上述方法的有用線路一次抓取所有內容,然後寫入整個信息來讓我們說一個文件。

所以在我的腦海裏看起來像遞歸法。但仍然無法弄清楚整個圖片,普羅布應該有兩個收集,一個爲父親,一個爲孩子,循環通過孩子和遞歸調用,以獲得更多的孩子,並將它們添加到收藏等。

我是想知道是否可以清除霧,我需要做什麼的高層次,如何收集應該看起來像什麼,在哪裏添加它們,在哪裏調用遞歸方法調用等... 和請不要專門考慮一個「treeview」對象,我只是用它作爲例子來更好地展示這個問題。主要的是我發佈的Foo方法的結構。這就是我應該與之合作的。

+0

(1)你能提供該列表中的類,所以我們不認爲只是一個TreeView? (2)你是指什麼*抓住一切*? – 2012-08-09 18:13:14

+0

@AndreCalil:抓住一切:我是指所有父親和所有孩子的父親和他們的孩子的整個等級。不僅僅是我們可以點擊一個樹視圖的具體的一個......想象它就像導出一個樹視圖可以顯示的全部數據層次結構,如果它的所有節點一次被展開。 – Bohn 2012-08-09 18:16:22

+0

第1條評論'//調用某個數據庫腳本'僅爲父節點和子數據獲取數據,並且不會比這更深? – Ankush 2012-08-09 18:17:31

回答

1

呃,我不確定這是否是你要找的東西,即使在其他答案之後。 但是,請看看:

自相關實體(節點)

public class MyEntity 
{ 
    public MyEntity() { } 

    public MyEntity(string Name, int ID, int? ParentID) 
    { 
     this.Name = Name; 
     this.ID = ID; 
     this.ParentID = ParentID; 
    } 

    public string Name { get; set; } 
    public int ID { get; set; } 
    public int? ParentID { get; set; } 
} 

樹的建築方法

public static StringBuilder GetFamilyTree(List<MyEntity> AllTheEntities) 
    { 
     StringBuilder Return = new StringBuilder(); 

     List<MyEntity> OrderedEntities = AllTheEntities.OrderBy<MyEntity, int>(x => x.ID).ToList(); 

     foreach (MyEntity CurrentEntity in AllTheEntities.Where<MyEntity>(x => !x.ParentID.HasValue)) 
     { 
      Return.AppendLine(GetEntityTree(AllTheEntities, CurrentEntity)); 
     } 

     return Return; 
    } 

    public static string GetEntityTree(List<MyEntity> AllTheEntities, MyEntity CurrentEntity, int CurrentLevel = 0) 
    { 
     StringBuilder Return = new StringBuilder(); 

     Return.AppendFormat("{0}{1}", "\t".Repeat(CurrentLevel), CurrentEntity.Name); 
     Return.AppendLine(); 

     List<MyEntity> Children = AllTheEntities.Where<MyEntity>(x => x.ParentID.HasValue && x.ParentID.Value == CurrentEntity.ID).ToList(); 

     if (Children != null && Children.Count > 0) 
     { 
      foreach (MyEntity CurrentChildEntity in Children) 
      { 
       Return.Append(GetEntityTree(AllTheEntities, CurrentChildEntity, CurrentLevel + 1)); 
      } 
     } 

     return Return.ToString(); 
    } 

一個小的輔助類

public static class StringExtension 
{ 
    public static string Repeat(this string text, int times) 
    { 
     string Return = string.Empty; 

     if (times > 0) 
     { 
      for (int i = 0; i < times; i++) 
      { 
       Return = string.Concat(Return, text); 
      } 
     } 

     return Return; 
    } 
} 

使用

 List<MyEntity> AllMyEntities = new List<MyEntity>(); 
     AllMyEntities.Add(new MyEntity("1", 1, null)); 
     AllMyEntities.Add(new MyEntity("1.1", 2, 1)); 
     AllMyEntities.Add(new MyEntity("1.1.1", 3, 2)); 
     AllMyEntities.Add(new MyEntity("2", 4, null)); 
     AllMyEntities.Add(new MyEntity("2.1", 5, 4)); 

     Console.Write(GetFamilyTree(AllMyEntities).ToString()); 

結果

1 
    1.1 
     1.1.1 
2 
    2.1 
1

呼叫Foo(child)for循環內。我想這會解決你的問題。如果樹很大,不要遞歸。使用堆棧。

+0

是的,但仍然沒有完成..如何填補我的父親和孩子的兩個集合...到最後知道,這個父親,有這些孩子......這個父親有這些孩子,..... – Bohn 2012-08-09 18:25:47

+0

它是不是兩個集合。這是n-ary樹。我想你在這個和簡單的二叉樹之間混淆了。 – Ankush 2012-08-09 18:28:55

+0

堆棧...請你解釋一下吧.. – Bohn 2012-08-09 18:29:09

1

你想做一個簡單的樹遍歷算法。這裏是僞代碼的簡單實現一個DFS(深度優先搜索)的:

TraverseTree(Tree t) 
{ 
    DoSomethingWith(t); // like writing the contents of the node to the file. 

    if (t == null) // leaf 
    return; 

    foreach(Tree child in t.Children) // recursively traverse the children. 
    { 
     TraverseTree(child); 
    } 
} 

您可以用命令你執行你的計算髮揮。查看更多詳情here

+0

爲什麼投票下來? – Vitaliy 2012-08-09 18:24:34

+0

我在我的問題中用粗體字寫了請不要考慮「樹」 – Bohn 2012-08-09 18:26:56

+0

@BDotA 您問過遞歸方法的結構,我爲你寫下了它。 – Vitaliy 2012-08-09 18:31:09