给出一个课程:

class Control
{
    public Control Parent { get; set; }
    public List<Control> Children { get; set; }
}

和一个清单:

List<Control> myControls;

是否可以编写一个选择所有子项的linq查询&amp;给定控制的孙子?例如,如果树看起来像这样:

GridA1
  PanelA1
    TextBoxA1
    TextBoxA2
    PanelA2
      ListBoxA1
      ListBoxA2
GridB1
  PanelB1
    TextBoxB1

我想要一个查询,给定列表myControls包含所有上面的控件,其中Parent和Children属性设置为approriate,可以使用PanelA1参数化并返回TextBoxA1,TextBoxA2,PanelA2,ListBoxA1和ListBoxA2。使用linq有一种有效的方法吗?我正在从数据库中选择一个树结构,并寻找一种比递归函数更好的分离子树的方法。

有帮助吗?

解决方案

使用LINQ以非常漂亮的方式很难做到这一点,因为lambda表达式在定义之前不能自我递归。递归函数(可能使用LINQ)是你最好的选择。

我如何实施它:

public IEnumerable<Control> ChildrenOf(this IEnumerable<Control> controls)
{
    return controls.SelectMany(c =>
        new Control[] { c }.Concat(ChildrenOf(c.Children)));
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top