【发布时间】:2009-03-24 16:26:04
【问题描述】:
使用 foreach 遍历数组时,是否可以保证返回元素的顺序是数组[0]、数组[1]、数组[2]、...
我知道 Array 类现在是这样实现的,但对框架的未来版本有任何保证吗?同样的问题也适用于 List。
【问题讨论】:
使用 foreach 遍历数组时,是否可以保证返回元素的顺序是数组[0]、数组[1]、数组[2]、...
我知道 Array 类现在是这样实现的,但对框架的未来版本有任何保证吗?同样的问题也适用于 List。
【问题讨论】:
到目前为止,我不得不不同意所有答案。
首先,C# 3.0 标准保证了数组上 foreach 的顺序:
foreach 遍历的顺序 数组的元素,如 如下:对于一维数组 元素以递增方式遍历 索引顺序,从索引 0 开始, 以索引长度结尾 - 1。对于 多维数组,元素是 遍历使得 最右边的维度增加了 首先,然后是下一个左侧维度, 以此类推向左。
--C# Language Specification Version 3.0,第 240 页。
其次,在对象上,foreach (C#) 和 For Each (VB.NET) 使用对象上的 MoveNext、Reset 和 Current 成员 (source) 工作。这些通常是 IEnumerator 接口的一部分。
在有顺序的集合中(阅读:实现 IList 或 IList(T) 的东西),这意味着元素将按照后备存储存储它们的顺序返回。
【讨论】:
没有任何保证。大多数列表/数组实现都会按顺序返回值,但肯定有例外,特别是在一些不太常见的集合类中。 (例如,在 C5 中,许多集合返回值的顺序与枚举时添加的顺序非常不同。)
【讨论】:
设计无法保证。 foreach 旨在用于无序枚举,并暗示运行时甚至可能并行处理多个元素。您永远不应该依赖任何枚举顺序。
【讨论】: