.NET foreach语句是否保证以与构建它相同的顺序迭代集合?

时间:2009-03-04 21:22:49

标签: .net collections foreach

一位同事使用for循环在他编写的一些C#代码中迭代List并留下评论,“没有使用For Each,因为我不确定它是否按顺序迭代。谁知道微软会做什么。”例如,假设我们有一个像这样构建的List:

var someList = new List<string>();

someList.Add("one");
someList.Add("two");
someList.Add("three");

我的同事使用了这样的东西:

for (int i = 0; i < someList.Count; i++)    
{
    System.Diagnostics.Debug.WriteLine(someList[i]);
}

而不是:

foreach (var item in someList)              
{
    System.Diagnostics.Debug.WriteLine(item);
}

我猜他担心这些物品可能会以不同于添加到集合中的顺序出现。我认为他有点偏执,但从技术上讲,文档并没有说明集合迭代的顺序。 foreach语句是否有可能以最低限度到最高限度之外的任何顺序遍历数组或集合对象?

3 个答案:

答案 0 :(得分:33)

您的问题是List<T>,它确实维持秩序。

独自一人,不能保证做任何事情。它只是询问为其枚举器提供的对象,它可以做任何事情。

答案 1 :(得分:23)

这取决于收藏品:

  • 对于List<T>,保证是插入顺序。 (假设只有Add个调用,如图所示。如果你在特定的地方将元素插入到列表中,它们会在你期望的正确位置返回。)基本上它与你得到的顺序相同取list[0]list[1]list[2]
  • 对于Dictionary<TKey, TValue>,无法保证订购。
  • 对于SortedList<TKey, TValue>(等等),它将处于按键比较顺序 - 这就是该类型的点。
  • 数组总是以元素顺序出现。

答案 2 :(得分:4)

要专门回答这个问题,“foreach”会返回。GetEnumerator()返回的顺序。对于列表,它是您添加内容的顺序。对于词典,它可能是分配事物的桶的顺序。