给出一个课程:
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有一种有效的方法吗?我正在从数据库中选择一个树结构,并寻找一种比递归函数更好的分离子树的方法。
答案 0 :(得分:2)
使用LINQ以非常漂亮的方式很难做到这一点,因为lambda表达式在定义之前不能自我递归。递归函数(可能使用LINQ)是你最好的选择。
我如何实施它:
public IEnumerable<Control> ChildrenOf(this IEnumerable<Control> controls)
{
return controls.SelectMany(c =>
new Control[] { c }.Concat(ChildrenOf(c.Children)));
}