订单在“;foreach”;决心

本文关键字:foreach 决心 | 更新日期: 2023-09-27 18:20:22

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

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

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

有没有一种方法可以确定标签在收集过程中的顺序?

订单在“;foreach”;决心

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('*');
}

如果要指定顺序,只需要对列表进行排序。例如,此代码很详细,但演示了OrderBy:的用法

var labels = Form.Controls.OfType<Label>();
var orderLabels = labels.OrderBy(l => l.Text);
foreach (Label lbl in orderedLabels)
{
    lbl.Text = lbl.Text.TrimEnd('*');
}

这将取决于Controls集合的顺序。它将首先查找Label类型的所有控件,比如说在数组中。

因此,它将从0开始,从1到n,foreach将从索引0开始。

如果你想指定它的顺序,你可以使用Linq扩展方法,即OrderBy

MSDN for OrderBy:此处