如何设置foreach循环通过控制面板的顺序?

本文关键字:控制面板 顺序 循环 foreach 何设置 设置 | 更新日期: 2023-09-27 18:02:46

我有一个foreach循环,通过一个面板的控制:

foreach(MyControl control in MyPanel.Controls)

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

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

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

如何设置foreach循环通过控制面板的顺序?

将集合强制转换为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();

你可以使用Linq来创建你的列表

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

试试这个:

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

正如你可能看到的,我使用OfType而不是Cast,因为Cast将抛出,如果它不能转换为CheckBox,而OfType将只返回可以转换为所需类型的对象。

欢呼

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