【问题标题】:How to approach this tree traversal如何处理这种树遍历
【发布时间】:2013-03-12 17:22:31
【问题描述】:

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

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

因此,鉴于橙色节点是第二个母版页的主要 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">

【问题讨论】:

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


    【解决方案1】:

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

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

    这将重用由GetChildControls 完成的树遍历。请注意,如果找不到控件,它将引发异常 - 如果您不希望这样,请使用 FirstOrDefault 而不是 First

    你可以像这样使用它:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-29
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      相关资源
      最近更新 更多