C#foreach循环 - 订单*稳定*保证?

Sup*_*est 13 c# collections foreach

假设我有一个给定的集合.在没有以任何方式更改集合的情况下,我使用foreach循环其内容两次.除了宇宙射线,什么不是,绝对保证顺序在两个循环中都是一致的?

或者,给定一个HashSet<string>包含许多元素的元素,可能导致以下注释行的输出不相等:

{
    var mySet = new HashSet<string>();
    // Some code which populates the HashSet<string>

    // Output1
    printContents(mySet);

    // Output2
    printContents(mySet);
}

public void printContents(HashSet<string> set) {
    foreach(var element in set) {
         Console.WriteLine(element);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我能得到一个解释导致实现不符合上述标准的原因的一般性答案将会有所帮助.具体而言,虽然,我很感兴趣Dictionary,List和数组.

Ale*_*kov 14

数组枚举保证顺序.

List并且List<T>期望提供稳定的订单(因为它们预期实现顺序索引的元素).

字典,HashSet明确不保证顺序.2个一个接一个地迭代项目的调用不太可能以不同的顺序返回项目,但是没有保证或期望.不应该指望任何特定的订单.

Dictionary/HashSet的排序版本按排序顺序返回项目.

其他IEnumerable对象可以随心所欲地执行任何操作.通常,实现迭代器的方式与用户的期望相匹配.即,如果提供了明确的顺序,那么具有隐式顺序的东西的枚举应该是稳定的 - 期望是稳定的.对未指定顺序的数据库的查询应该以半随机顺序返回项目.

检查这个问题是否有链接:C#中的foreach循环是否保证评估顺序?


Eri*_* J. 5

实施的所有内容均以IEnumerable<T>自己的方式执行。无法普遍保证任何给定的集合都必须确保稳定性。

如果您专门指的是Collection<T>http://msdn.microsoft.com/zh-cn/library/ms132397.aspx),则在其MSDN参考中看不到任何特定的保证顺序一致的信息。

可能会保持一致吗?是。有书面保证吗?不是我能找到。