2012-08-09 88 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