Asp.net

使用 LINQ 進行遞歸控制搜尋

  • October 31, 2008

如果我想在 ASP.NET 頁面上找到選中的複選框,我可以使用以下 LINQ 查詢。

var checkBoxes = this.Controls
                    .OfType<CheckBox>()
                    .TakeWhile<CheckBox>(cb => cb.Checked);

如果復選框嵌套在目前控制項集合中,那效果很好,但我想知道如何通過深入研究頂級控制項的控制項集合來擴展搜尋。

問題在這裡被問到:

在 ASP.NET 中查找使用特定介面的控制項

並且收到了非 LINQ 的答案,我已經有了自己的類型和 ID 遞歸控制搜尋版本作為擴展方法,但我只是想知道這在 LINQ 中有多容易?

從遞歸中檢查類型/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);

(編輯:將 AllControls 更改為 GetAllControls 並正確使用它作為一種方法。)

引用自:https://stackoverflow.com/questions/253937