如何确定“foreach”中的顺序?

时间:2015-11-03 01:26:21

标签: c# foreach

我想知道是什么决定了foreach循环中的顺序?

例如,我有一个循环可以从标签中删除任何'*'字符:

foreach (Label lbl in Form.Controls.OfType<Label>())
{
    lbl.Text = lbl.Text.TrimEnd('*');
}

有没有办法确定标签在逐步完成集合时的顺序是什么?

3 个答案:

答案 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