5

使用 foreach 遍历数组时,是否可以保证返回元素的顺序是数组 [0]、数组 [1]、数组 [2]、...

我知道这就是现在实现 Array 类的方式,但是对框架的未来版本有任何保证吗?List<> 也有同样的问题。

4

3 回答 3

20

到目前为止,我不得不不同意所有的答案。

首先,C# 3.0 标准保证了数组上 foreach 的顺序:

foreach 遍历数组元素的顺序如下: 对于单维数组,元素以索引递增的顺序遍历,从索引 0 开始,以索引 Length – 1 结束。对于多维数组,遍历元素这样最右边维度的索引首先增加,然后是下一个左边的维度,依此类推到左边。

-- C# 语言规范版本 3.0,第 240 页。

其次,在对象上,foreach (C#) 和 For Each (VB.NET) 通过使用对象 ( source ) 上的 MoveNext、Reset 和 Current 成员来工作。这些通常是 IEnumerator 接口的一部分。

在具有顺序的集合中(阅读:实现 IList 或 IList(T) 的事物),这意味着元素将按照后备存储存储它们的顺序返回。

于 2009-03-24T17:08:17.960 回答
5

没有任何保证。大多数列表/数组实现将按顺序返回值,但肯定有例外,特别是在一些不太常见的集合类中。(例如,在 C5 中,许多集合返回值的顺序与枚举时添加的顺序非常不同。)

于 2009-03-24T16:30:57.003 回答
0

没有设计保证。foreach 旨在用于无序枚举,并暗示运行时甚至可能并行处理多个元素。您永远不应该依赖任何枚举顺序。

于 2009-03-24T16:33:07.810 回答