如何设置foreach循环在一组控件中循环的顺序?

时间:2015-07-15 14:53:40

标签: c# winforms

我有一个foreach循环,通过一组控件:

foreach(MyControl control in MyPanel.Controls)

并将选中的每个复选框控件的名称添加到列表中:

if (control.Checked == true)
{
  MyList.Add(control.Name)
}

但似乎按照将它们添加到列表中的顺序跳转到面板周围。如何设置它在面板中运行的顺序,以便它以指定的顺序添加以MyList检查的控件的名称?

4 个答案:

答案 0 :(得分:2)

将收藏集投射到IEnumerable<Control>并使用OrderBy

foreach(MyControl control in MyPanel.Controls.Cast<Control>.OrderBy(c => c.Name))
{
    if (control.Checked == true)
    {
        MyList.Add(control.Name)
    }
}

或者在添加所有名称后对列表进行排序,因为您只是将名称存储在列表中:

MyList.Sort();

答案 1 :(得分:2)

您可以使用Linq创建列表

var MyList = MyPanel.Controls.Cast<Control>.OrderBy(c => c.Name).Where(c=>c.Checked).ToList();

答案 2 :(得分:1)

试试这个:

var MyList = MyPanel.Controls.OfType<CheckBox>()
              .Where(c => c.Checked)
              .OrderBy(c => c.Name)
              .ToList();

正如您可能看到的那样,我使用的是OfType而不是Cast,因为如果Cast无法转换为CheckBox,则会抛出,而OfType只会返回可以转换为所需类型的对象。

干杯

答案 3 :(得分:-1)

MyPanel.Controls返回一个ControlCollection。 ControlCollection实现了IList接口,因此您可以使用LINQ对其进行排序。