代码之家  ›  专栏  ›  技术社区  ›  Jakob Christensen

在数组、列表等上使用foreach时的排序顺序

  •  5
  • Jakob Christensen  · 技术社区  · 17 年前

    3 回复  |  直到 17 年前
        1
  •  20
  •   Powerlord    17 年前

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

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

        2
  •  5
  •   Reed Copsey    17 年前

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

        3
  •  0
  •   sharptooth    17 年前

    设计不保证。foreach用于无顺序枚举,意味着运行时甚至可能并行处理多个元素。你永远不应该依赖任何枚举顺序。