如何处理这个树遍历

时间:2013-03-12 17:22:31

标签: c# .net data-structures tree traversal

已经有一段时间了,因为我不得不进行树遍历并想要一些输入。这是一个示例树:

tree

树是我的ASP.NET页面。此页面由2个母版页和内容页面组成。我想要做的是找到作为我的第二个母版页主要内容的控件,然后将所有控件放在一个平面数据结构中,例如列表。

所以假设Orange节点是第二个母版页的主要ContentPlaceHolder,我想将所有那些存储在我的列表中的蓝色椭圆中。我已经创建了一些代码,用于返回集合中控件的所有子节点,孙子节点等:

private IEnumerable<Control> GetChildControls(Control parentControl)
{
    foreach (Control control in parentControl.Controls)
    {
        yield return control;
        foreach(Control grandchild in GetChildControls(control))
        {
            yield return grandchild;
        }
    }
}

但是我对如何将这个树过滤到一个节点并且它是孩子们有点困惑。如果有帮助,橙色节点应如下:

<asp:Content ID="SystemMasterMainContentPlaceHolder" runat="server" ContentPlaceHolderID="MainContentPlaceholder">

1 个答案:

答案 0 :(得分:2)

您基本上可以使用已有方法和GetChildById()方法的组合。

private Control GetChildById(string controlId, Control parent)
{
    return GetChildControls(parent).First(c => c.ID == controlId);
}

这将重用GetChildControls完成的树遍历。请注意,如果找不到控件,它将抛出异常 - 如果您不想这样做,请使用FirstOrDefault代替First

您可以像这样使用它:

GetChildControls(GetChildById("SystemMasterMainContentPlaceHolder", Page));