假设我有一个给定的集合。在不以任何方式更改集合的情况下,我使用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);
}
}如果我能得到一个一般性的答案,解释是什么导致实现不符合上述标准,那将是很有帮助的。不过,我对Dictionary、List和数组特别感兴趣。
发布于 2012-07-27 10:29:38
数组枚举保证了顺序。
List和List<T>应该提供稳定的顺序(因为它们应该实现顺序索引的元素)。
字典、HashSet显式地不保证顺序。两次逐个迭代项目的调用不太可能以不同的顺序返回项目,但没有保证或期望。人们不应该期望任何特定的顺序。
Dictionary/HashSet的排序版本按排序顺序返回项。
其他IEnumerable对象可以自由地做他们想做的任何事情。通常情况下,实现迭代器的方式与用户的期望相符。也就是说,如果提供了显式顺序,则具有隐式顺序的事物的枚举应该是稳定的-预期是稳定的。对未指定顺序的数据库的查询应以半随机顺序返回项目。
查看此问题中的链接:Does the foreach loop in C# guarantee an order of evaluation?
发布于 2012-07-27 09:43:27
所有实现IEnumerable<T>的东西都是以自己的方式实现的。没有一般的保证,任何给定的集合都必须确保稳定性。
如果您特别指的是Collection<T> (http://msdn.microsoft.com/en-us/library/ms132397.aspx),我在它的MSDN引用中看不到任何关于顺序一致的具体保证。
它可能是一致的吗?是。有书面保证吗?我找不到。
发布于 2012-07-27 09:57:25
对于许多C#集合,都有该集合的排序版本。例如,HashSet对于SortedSet就像Dictionary对于SortedDictionary一样。如果您正在处理顺序不重要的东西,比如Dictionary,那么您不能假设循环顺序每次都会以相同的方式运行。
https://stackoverflow.com/questions/11680347
复制相似问题