我有一个foreach循环,通过一组控件:
foreach(MyControl control in MyPanel.Controls)
并将选中的每个复选框控件的名称添加到列表中:
if (control.Checked == true)
{
MyList.Add(control.Name)
}
但似乎按照将它们添加到列表中的顺序跳转到面板周围。如何设置它在面板中运行的顺序,以便它以指定的顺序添加以MyList检查的控件的名称?
答案 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对其进行排序。