使用LINQ进行递归控制搜索

Phi*_*fin 35 asp.net linq-to-objects .net-3.5 c#-3.0

如果我想在ASP.NET页面上找到选中的复选框,我可以使用以下LINQ查询.

var checkBoxes = this.Controls
                     .OfType<CheckBox>()
                     .TakeWhile<CheckBox>(cb => cb.Checked);
Run Code Online (Sandbox Code Playgroud)

如果复选框嵌套在当前控件集合中,那么工作正常,但我想知道如何通过向下钻取到顶级控件的控件集合来扩展搜索.

这里问的问题是:

查找在ASP.NET中使用某个接口的控件

并且收到了非LINQ答案,我已经有自己的类型和ID作为扩展方法的递归控件搜索版本,但我只是想知道在LINQ中这样做有多容易?

Jon*_*eet 45

从递归中取出类型/ ID检查,所以只需要"给我所有控件,递归"方法,例如

public static IEnumerable<Control> GetAllControls(this Control parent)
{
    foreach (Control control in parent.Controls)
    {
        yield return control;
        foreach(Control descendant in control.GetAllControls())
        {
            yield return descendant;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这有点效率低(在创建大量迭代器方面),但我怀疑你会有一个非常深的树.

然后,您可以将原始查询编写为:

var checkBoxes = this.GetAllControls()
                     .OfType<CheckBox>()
                     .TakeWhile<CheckBox>(cb => cb.Checked);
Run Code Online (Sandbox Code Playgroud)

(编辑:将AllControls更改为GetAllControls并正确使用它作为方法.)