如果我想在ASP.NET页面上找到选中的复选框,我可以使用以下LINQ查询.
var checkBoxes = this.Controls .OfType() .TakeWhile (cb => cb.Checked);
如果复选框嵌套在当前控件集合中,那么工作正常,但我想知道如何通过向下钻取到顶级控件的控件集合来扩展搜索.
这里问的问题是:
查找在ASP.NET中使用某个接口的控件
并且收到了非LINQ答案,我已经有自己的类型和ID作为扩展方法的递归控件搜索版本,但我只是想知道在LINQ中这样做有多容易?
从递归中取出类型/ ID检查,所以只需要"给我所有控件,递归"方法,例如
public static IEnumerableGetAllControls(this Control parent) { foreach (Control control in parent.Controls) { yield return control; foreach(Control descendant in control.GetAllControls()) { yield return descendant; } } }
这有点效率低(在创建大量迭代器方面),但我怀疑你会有一个非常深的树.
然后,您可以将原始查询编写为:
var checkBoxes = this.GetAllControls() .OfType() .TakeWhile (cb => cb.Checked);
(编辑:将AllControls更改为GetAllControls并正确使用它作为方法.)