15

一位同事使用 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 语句是否可以以除从最低到最高之外的任何顺序遍历数组或集合对象?

4

3 回答 3

33

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

单独的 foreach 不能保证做任何事情。它只是询问为其枚举器提供的对象,这可能会做任何事情。

于 2009-03-04T21:25:01.240 回答
23

这取决于集合:

  • 因为List<T>它保证是插入顺序。(假设只是Add调用,如图所示。如果您将元素插入到列表中的特定位置,它们将在您期望的正确位置返回。)基本上它与您通过 , 等获得的list[0]顺序list[1]相同list[2]
  • 因为Dictionary<TKey, TValue>没有保证订购。
  • 对于SortedList<TKey, TValue>(等),它将按关键比较顺序排列——这就是类型的重点。
  • 数组总是按元素顺序出现。
于 2009-03-04T21:25:22.160 回答
4

为了具体回答这个问题,“foreach”返回 . GetEnumerator () 返回。对于列表,这是您将内容添加到末尾的顺序。对于字典,它可能是分配事物的存储桶的顺序。

于 2009-03-04T21:28:48.610 回答