我想知道是什么决定了foreach循环中的顺序?
例如,我有一个循环可以从标签中删除任何'*'字符:
foreach (Label lbl in Form.Controls.OfType<Label>())
{
lbl.Text = lbl.Text.TrimEnd('*');
}
有没有办法确定标签在逐步完成集合时的顺序是什么?
答案 0 :(得分:5)
foreach
使用向其提供的IEnumerable
订单的任何顺序,因此订单的最新值为Form.Controls
。顺序是.designer.cs
文件中自动生成的代码决定生成的顺序。
如果您想强制执行订单,则需要先对IEnumerable
进行排序,然后再将其提交给foreach
。例如,下面的代码将按控件名称对它们进行排序。
foreach (Label lbl in Form.Controls.OfType<Label>().OrderBy(x=>x.Name)
{
lbl.Text = lbl.Text.TrimEnd('*');
}
答案 1 :(得分:1)
如果要指定订单,只需订购清单即可。例如,此代码很详细,但演示了OrderBy
:
var labels = Form.Controls.OfType<Label>();
var orderLabels = labels.OrderBy(l => l.Text);
foreach (Label lbl in orderedLabels)
{
lbl.Text = lbl.Text.TrimEnd('*');
}
答案 2 :(得分:0)
这取决于Controls
集合的顺序。它将首先查找类型为Label
的所有控件,并且可以在数组中进行说明。
因此它将从0开始到1到n,foreach
将从索引0开始。
如果您想指定它的顺序,可以使用Linq扩展方法,即OrderBy
订单的MSDN:Here