每个循环的C#以什么顺序迭代List <T>?

我想知道在C#中的foreach循环通过System.Collections.Generic.List<T>对象循环的顺序。

我发现了另一个关于同一个话题的问题,但是我不觉得这个问题对我的满意度回答了我的问题。

有人说没有定义订单。 但是,正如其他人所说,它遍历一个数组的顺序是固定的(从0到Length-1)。 8.8.4 foreach语句

还有人说,对于任何具有订单的标准类(例如List<T> )也是如此。 我找不到任何文件来支持。 所以我知道现在可能会这样工作,但也许在下一个.NET版本中,它将是不同的(即使它不太可能)。

我也看了List(t).Enumerator文档没有运气。

另一个相关的问题指出,对于Java,在文档中特别提到:

List.iterator()以适当的顺序返回此列表中元素的迭代器。

我正在寻找类似于C#文档中的东西。

提前致谢。

编辑:谢谢你所有的答案(惊人的速度有多less回复)。 我从所有的答案中得知, List<T>总是按照索引的顺序进行迭代。 但是我仍然希望看到文档的清晰和平,类似于List上的Java文档 。

基本上取决于IEnumerator实现 – 但是对于一个List<T>它总是按照列表的自然顺序进行,即与索引器list[0]list[1]list[2]等相同的顺序。

我不相信这是明确logging – 至less,我还没有find这样的文件 – 但我认为你可以把它作为保证。 对这个顺序的任何改变都会毫无意义地破坏所有types的代码。 事实上,我很惊讶地发现IList<T>实现不符合这个。 诚然,这将是很高兴看到它具体logging…

在您的链接中,接受的答案在C#语言规范版本3.0,第240页中列出 :

foreach遍历数组元素的顺序如下:对于一维数组,元素以递增的索引顺序遍历,索引从0开始,以索引Length – 1结束。对于multidimensional array,遍历元素使得最右边的维度的索引首先增加,然后是下一个左边的维度,以此类推到左边。 以下示例按元素顺序打印出二维数组中的每个值:

 using System; class Test { static void Main() { double[,] values = { {1.2, 2.3, 3.4, 4.5}, {5.6, 6.7, 7.8, 8.9} }; foreach (double elementValue in values) Console.Write("{0} ", elementValue); Console.WriteLine(); } } 

产生的输出如下:1.2 2.3 3.4 4.5 5.6 6.7 7.8 8.9在这个例子中

 int[] numbers = { 1, 3, 5, 7, 9 }; foreach (var n in numbers) Console.WriteLine(n); the type of n is inferred to be int, the element type of numbers. 

这个顺序是由迭代器定义的,这个迭代器是用foreach循环遍历一个数据集合的。

如果您正在使用可索引的标准集合(如List),那么它将遍历从索引0开始并向上移动的集合。

如果您需要控制顺序,您可以通过实现自己的IEnumerable来控制如何处理集合的迭代,或者可以在执行foreach循环之前按照您想要的方式对列表进行sorting。

这解释了Enumerator如何工作于通用List。 首先,当前元素是未定义的,并使用MoveNext进入下一个项目。

如果您阅读MoveNext,则表示它将从集合的第一个元素开始,然后移动到下一个元素,直到到达集合的末尾。

列表似乎会按照它们在后台存储中的顺序返回这些项目 – 所以如果它们以这种方式添加到列表中,它们将以这种方式返回。

如果您的程序依赖于sorting,则可能需要在遍历列表之前对其进行sorting。

线性search有点愚蠢 – 但是如果您需要某种方式的订单,那么最好的办法就是按顺序制作这些项目。

我只是需要做一些类似于快速编写的代码,虽然它没有为我正在尝试做的工作,但它为我重新排列列表。

使用LINQ来改变顺序

  DataGridViewColumn[] gridColumns = new DataGridViewColumn[dataGridView1.Columns.Count]; dataGridView1.Columns.CopyTo(gridColumns, 0); //This created a list of columns gridColumns = (from n in gridColumns orderby n.DisplayIndex descending select n).ToArray(); //This then changed the order based on the displayindex