使用LINQ设置控件的可视性

使用LINQ设置控件的可视性,linq,collections,controls,Linq,Collections,Controls,我正在重构一些代码来练习LINQ。由于某种原因,我无法让这个代码配合 //ActionControls is a ControlCollection var actionControls = flowLayoutPanel1.FilterControls(c => c is Button); //TODO: Optimize foreach(var control in actionControls) { control.Visible = w

我正在重构一些代码来练习LINQ。由于某种原因,我无法让这个代码配合

        //ActionControls is a ControlCollection
var actionControls = flowLayoutPanel1.FilterControls(c => c is Button);

    //TODO: Optimize
  foreach(var control in actionControls)
  {
      control.Visible = workingItemDataTable.AsEnumerable().Any(row => "btn" + row.Field<string>("Name") == control.Name);
  }
我现在想做的事

flowLayoutPanel1.FilterControls(c => c is Button && c.Name == "btnTaskInfo"//btnTaskInfo is always visible
                   || workingItemDataTable.AsEnumerable().Any(row => "btn" + row.Field<string>("Name") == c.Name)).Cast<Button>()

但在将其转换为按钮之后,我无法理解如何设置visible=false。有什么建议吗?

您仍然需要迭代这些控件,但您可能可以这样做,假设FilterControl只是其中的别名:

var actionControls = flowLayoutPanel1.OfType<Button>();
在lambda表达式中迭代和执行集合有一些技巧和快捷方式,但这会使代码看起来很混乱,而且它们大多只是黑客。如果您真的想要创建自己的扩展ForEach,那么您可以创建自己的扩展ForEach

flowLayoutPanel1.OfType<Button>().ForEach(btn=>{btn.Visible= ... });

linq只是一种语法糖,你必须在控件集合上进行迭代。我希望使用某种select语句或者集合之类的东西。但那是我想的我只是不确定那是我想的。是的,过滤器控件做得更多,它从上一级父级一直过滤到下一级