【问题标题】:Sort order when using foreach on an array, list etc在数组、列表等上使用 foreach 时的排序顺序
【发布时间】:2009-03-24 16:26:04
【问题描述】:

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

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

【问题讨论】:

    标签: .net arrays foreach


    【解决方案1】:

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

    首先,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) 的东西),这意味着元素将按照后备存储存储它们的顺序返回。

    【讨论】:

    • +1 因为这对所有标准数组和列表都是正确的。虽然有点迂腐,但实现 IList(T) 的自定义类可以实现自己的枚举器,以按照它喜欢的任何顺序返回元素。
    • 太棒了!谢谢。我刚刚赢了一个同事的赌注:)
    • Array 确实如此,但其他集合则不一定。
    【解决方案2】:

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

    【讨论】:

    • 我不同意这里的反对意见。正如我所提到的,有一些不保证顺序的列表实现。 C# 中的标准数组以及 BCL 的 List 类确实保证了顺序,但最初的问题并不仅限于这些......
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-21
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多