我可以在C#winforms中使用foreach循环评估两组项目吗?

时间:2013-08-07 13:52:06

标签: c# winforms foreach

我有一个winforms TabControl,我试图遍历每个标签中包含的所有控件。有没有办法在and循环中添加foreach或者是否可以评估多个项目组?例如,这就是我想要做的事情:

foreach (Control c in tb_Invoices.Controls and tb_Statements.Controls)
{
    //do something
}

OR

foreach (Control c in tb_Invoices.Controls, tb_Statements.Controls)
{
    //do something
}

这是可能的,如果没有,那么下一个最好的东西是什么?我是否需要使用for循环?

6 个答案:

答案 0 :(得分:4)

foreach(TabPage page in yourTabControl.TabPages){
   foreach(Control c in page.Controls){
      LoopThroughControls(c);
   }  
}

private void LoopThroughControls(Control parent){
   foreach(Control c in parent.Controls)
      LoopThroughControls(c);
}

答案 1 :(得分:3)

最终解决方案:

var allControls = from TabPage p in tabControl.TabPages
                  from Control c in p.Controls
                  select c;

原始答案 - 使用Concat

var allControls = tb_Invoices.Controls.Cast<Control>()
                             .Concat(tb_Statements.Controls.Cast<Control>();

BTW我认为最好在这里使用简单的非通用ArrayList

ArrayList allControls = new ArrayList();
allControls.AddRange(tb_Invoices.Controls);
allControls.AddRange(tb_Statements.Controls);

答案 2 :(得分:0)

我喜欢做的是:

var list = new List<T>();
list.AddRange(list1);
list.AddRange(list2);
list.AddRange(list3);
list.AddRange(list4);

foreach (T item in list)
{
    .....
}

答案 3 :(得分:0)

您可以通过递归写入来使用一个foreach循环。这将确保循环遍历表单中所有类型的所有控件。

private void LoopAllControls(Control YourObject)
   foreach(Control c in YourObject.Controls)
   {
      if(C.Controls.Count > 0)
        LoopAllControls(c.Controls);
      //your code
   }

答案 4 :(得分:0)

你可以这样做:

public static void ForAllChildren(Action<Control> action, 
    params Control[] parents)
{
    foreach(var p in parents)
        foreach(Control c in p.Controls)
            action(c);
}

叫做:

ForAllChildren(x => Foo(x), tb_Invoices, tb_Statements);

虽然在这种情况下你可以使用嵌套的foreach

,但你可能会对动作调用的性能有所提高。
foreach (var p in new Control[] { tb_Invoices, tb_Statements })
    foreach (Control c in p.Controls)
        Foo(c);

类似地,循环遍历任何非泛型IEnumerable中所有项目的通用解决方案可能是(虽然有点像使用大锤来敲钉子):

public static void ForEachAll<T>(Action<T> action, 
    params System.Collections.IEnumerable[] collections)
{
    foreach(var collection in collections)
        foreach(var item in collection.Cast<T>())
            action(item);
}

叫做:

ForEachAll<Control>(x => Foo(x), tb_Invoices.Controls, tb_Statements.Controls);

答案 5 :(得分:0)

如果您无法使用LINQ(如使用.NET2),我建议您使用此方法:

public static IEnumerable<T> Concat<T>(params IEnumerable<T>[] args)
{
    foreach (IEnumerable<T> collection in args)
    {
        foreach (T item in collection)
        {
            yield return item;
        }
    }
}

现在你有了一个泛型函数,你可以使用任何可枚举的。你的循环可能如下所示:

foreach (Control c in Concat(tb_Invoices.Controls, tb_Statements.Controls))
{
    //do something
}

简单,便宜且富有表现力!

编辑:如果您的收藏集未实现IEnumerable<T>但只实现IEnumerable,则可以添加一个接受后者的重载。除了T在嵌套循环中更改为object之外,其他所有内容都保持不变。