为了账号安全,请及时绑定邮箱和手机立即绑定

使用LINQ进行递归控制搜索

使用LINQ进行递归控制搜索

蛊毒传说 2019-12-03 14:19:22
如果我想在ASP.NET页上找到选中的复选框,则可以使用以下LINQ查询。var checkBoxes = this.Controls                     .OfType<CheckBox>()                     .TakeWhile<CheckBox>(cb => cb.Checked);如果复选框嵌套在当前控件集合中,则效果很好,但我想知道如何通过向下钻取顶级控件的控件集合来扩展搜索。在这里提出的问题是:在ASP.NET中查找使用特定接口的控件收到非LINQ答案后,我已经有了自己的版本的递归控件搜索,该搜索以类型和ID作为扩展方法,但我只是想知道在LINQ中这样做有多容易?
查看完整描述

3 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

从递归中取出类型/ 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;

        }

    }

}

这有点低效(在创造大量的迭代器而言),但我怀疑,你将有一个非常深树。


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


var checkBoxes = this.GetAllControls()

                     .OfType<CheckBox>()

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


查看完整回答
反对 回复 2019-12-03
?
慕后森

TA贡献1802条经验 获得超5个赞

我建议进行AllControls递归的是:


    public static IEnumerable<Control> AllControls(this Control parent)

    {

        foreach (Control control in parent.Controls)

        {

             yield return control;

        }

        foreach (Control control in parent.Controls)

        {

            foreach (Control cc in AllControls(control)) yield return cc;

        }

    }

第二个foreach看起来很奇怪,但这是我知道的“扁平化”递归调用的唯一方法。


查看完整回答
反对 回复 2019-12-03
  • 3 回答
  • 0 关注
  • 601 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信