猿问

使用LINQ进行递归控制搜索

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


var checkBoxes = this.Controls

                     .OfType<CheckBox>()

                     .TakeWhile<CheckBox>(cb => cb.Checked);

如果复选框嵌套在当前控件集合中,则效果很好,但我想知道如何通过向下钻取顶级控件的控件集合来扩展搜索。


在这里提出的问题是:


在ASP.NET中查找使用特定接口的控件


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


蛊毒传说
浏览 602回答 3
3回答

小怪兽爱吃肉

从递归中取出类型/ ID检查,因此只需采用“递归地提供所有控件”的方法,例如public static IEnumerable<Control> GetAllControls(this Control parent){&nbsp; &nbsp; foreach (Control control in parent.Controls)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; yield return control;&nbsp; &nbsp; &nbsp; &nbsp; foreach(Control descendant in control.GetAllControls())&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; yield return descendant;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}这有点低效(在创造大量的迭代器而言),但我怀疑,你将有一个非常深树。然后,您可以将原始查询写为:var checkBoxes = this.GetAllControls()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.OfType<CheckBox>()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.TakeWhile<CheckBox>(cb => cb.Checked);

慕后森

我建议进行AllControls递归的是:&nbsp; &nbsp; public static IEnumerable<Control> AllControls(this Control parent)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; foreach (Control control in parent.Controls)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;yield return control;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; foreach (Control control in parent.Controls)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach (Control cc in AllControls(control)) yield return cc;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }第二个foreach看起来很奇怪,但这是我知道的“扁平化”递归调用的唯一方法。
随时随地看视频慕课网APP
我要回答