首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# foreach循环-顺序*稳定性*有保证吗?

C# foreach循环-顺序*稳定性*有保证吗?
EN

Stack Overflow用户
提问于 2012-07-27 09:36:46
回答 4查看 13K关注 0票数 15

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

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

代码语言:javascript
复制
{
    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);
    }
}

如果我能得到一个一般性的答案,解释是什么导致实现不符合上述标准,那将是很有帮助的。不过,我对DictionaryList和数组特别感兴趣。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-27 10:29:38

数组枚举保证了顺序。

ListList<T>应该提供稳定的顺序(因为它们应该实现顺序索引的元素)。

字典、HashSet显式地不保证顺序。两次逐个迭代项目的调用不太可能以不同的顺序返回项目,但没有保证或期望。人们不应该期望任何特定的顺序。

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

其他IEnumerable对象可以自由地做他们想做的任何事情。通常情况下,实现迭代器的方式与用户的期望相符。也就是说,如果提供了显式顺序,则具有隐式顺序的事物的枚举应该是稳定的-预期是稳定的。对未指定顺序的数据库的查询应以半随机顺序返回项目。

查看此问题中的链接:Does the foreach loop in C# guarantee an order of evaluation?

票数 15
EN

Stack Overflow用户

发布于 2012-07-27 09:43:27

所有实现IEnumerable<T>的东西都是以自己的方式实现的。没有一般的保证,任何给定的集合都必须确保稳定性。

如果您特别指的是Collection<T> (http://msdn.microsoft.com/en-us/library/ms132397.aspx),我在它的MSDN引用中看不到任何关于顺序一致的具体保证。

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

票数 5
EN

Stack Overflow用户

发布于 2012-07-27 09:57:25

对于许多C#集合,都有该集合的排序版本。例如,HashSet对于SortedSet就像Dictionary对于SortedDictionary一样。如果您正在处理顺序不重要的东西,比如Dictionary,那么您不能假设循环顺序每次都会以相同的方式运行。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11680347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档