每个循环的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