获得父子关系

时间:2012-08-09 18:09:36

标签: c# collections recursion

假设我们有一个拥有TreeView的Windows应用程序,您可以扩展此视图的节点并向下钻取到子节点,它们也可能有更多子节点,所以现在我们可以扩展该节点并进一步扩展等等。所以在我的源代码中,我有一个方法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应用程序,我们点击一​​个节点,它运行此方法一次并收集所需的数据。现在我需要使用上面方法的有用行来编写另一个方法Grab EVERYTHING并写下整个信息让我们说一个文件。

所以在我看来,对我来说看起来像一个递归的方法。但仍然无法弄清楚整个画面,Prob应该有两个系列,一个用于父亲,一个用于孩子,循环播放孩子并进行递归调用以获得更多孩子并将其添加到收藏中等等。

我想知道你是否可以清除雾,我需要做的高级别,选择应该是什么样子,在哪里添加它们,在哪里调用递归方法调用等等。 。并且请不要专门考虑一个“treeview”对象,我只是以此为例来更好地解决这个问题。主要是我发布的Foo方法的结构。那是我应该合作的。

3 个答案:

答案 0 :(得分:1)

Foo(child)循环内调用for。我想这会解决你的问题。如果树很大,不要递归。使用Stack。

答案 1 :(得分: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

答案 2 :(得分: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