2009-05-06 77 views
1

的树给定一个类:写LINQ表达式来选择项目

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

和一个列表:

List<Control> myControls; 

是否可以写一个LINQ查询,将选择所有的孩子&孙子对于给定的控制?例如,如果一个树是这个样子:

GridA1 
    PanelA1 
    TextBoxA1 
    TextBoxA2 
    PanelA2 
     ListBoxA1 
     ListBoxA2 
GridB1 
    PanelB1 
    TextBoxB1 

我想查询的是,给定的列表,包含所有以上家长和儿童的属性设置为approriate控制可以与PanelA1进行参数和返回TextBoxA1,TextBoxA2 myControls ,PanelA2,ListBoxA1和ListBoxA2。有没有一种有效的方法来与linq做到这一点?我从数据库中选择了一个树结构,并寻找一种比递归函数更好地分离子树的方法。

回答

2

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

我怎么会实现它:

public IEnumerable<Control> ChildrenOf(this IEnumerable<Control> controls) 
{ 
    return controls.SelectMany(c => 
     new Control[] { c }.Concat(ChildrenOf(c.Children))); 
}