【问题标题】:working of IEnumerable in for looping controlsIEnumerable 在 for 循环控件中的工作
【发布时间】:2015-06-28 09:42:39
【问题描述】:

谁能帮我看看这段代码是如何工作的。 IEnumarable 如何保存在内存中 var 在这种情况下到底做了什么?为什么他们在这段代码中使用 concat 它到底是什么连接

public IEnumerable<Control> GetAll(Control control,Type type)
{
    var controls = control.Controls.Cast<Control>();
    return controls.SelectMany(ctrl => GetAll(ctrl,type)).Concat(controls) 
                                                         .Where(c => c.GetType() == type);
}

【问题讨论】:

    标签: c# linq ienumerable


    【解决方案1】:

    IEnumerable 是一个接口。当一个类型实现 IEnumerable 时会公开一个枚举器,该枚举器可用于遍历类型元素。

    例如,一个数组实现了这个接口。因此,您可以使用 foreach 语句遍历它的项目:

    foreach(var item in array)
    {
        // ...
    }
    

    此方法GetAll 返回Control 对象的序列。这可以是Control 对象的数组、Control 对象的列表或实现IEnumerable&lt;Control&gt; 的每个类型。此方法获取两个对象作为参数,一个是Control 类型,另一个是Type 类型。然后在名为controls 的变量中存储控件中包含的控件集合。有关这方面的更多信息,请查看here。在此之后,这里:

    return controls.SelectMany(ctrl => GetAll(ctrl,type))
                   .Concat(controls)
                   .Where(c => c.GetType() == type);
    

    foreach 控件中的控件你得到它包含了同时递归的控件。然后用controls 加入这两个序列并返回它们。

    简而言之,如果你传递一个类型为按钮的控件,那么GetAll 方法将返回一个包含在同一面板中的所有按钮的序列。

    【讨论】:

      【解决方案2】:

      你可以简单地使用:

       control.Controls.OfType<type>();
      

      如果您想要类型为 type

      controlimmediate 子控件

      【讨论】:

      • 那只返回第一层深,而他的代码检索所有控件。
      猜你喜欢
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多