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

rav*_*ven 15 .net collections foreach

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

var someList = new List<string>();

someList.Add("one");
someList.Add("two");
someList.Add("three");
Run Code Online (Sandbox Code Playgroud)

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

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

而不是这个:

foreach (var item in someList)              
{
    System.Diagnostics.Debug.WriteLine(item);
}
Run Code Online (Sandbox Code Playgroud)

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

Rex*_*x M 33

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

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

  • 由于我自己的upvote,你现在有一个比我更多.我认为这不是你所说的Skeet效果;) (4认同)
  • +1哦不,Skeet效果让你获得更少的选票. (3认同)

Jon*_*eet 23

这取决于集合:

  • 因为List<T>它保证是插入订单.(这是假设只是Add调用,如图所示.如果插入的元素到列表中在特定的地方,他们会得到在适当的管制站返回你所期望的.)它基本上是相同的顺序你会采取让list[0],list[1],list[2]等.
  • 因为Dictionary<TKey, TValue>没有保证订购.
  • 对于SortedList<TKey, TValue>(等)它将处于关键比较顺序 - 这就是类型的要点.
  • 数组总是以元素顺序出现.

  • @devinb我认为这就是@Jon所说的. (2认同)
  • 好吧,foreach保证从集合中使用GetEnumerator - 所以如果你知道集合的迭代器的顺序,那么你可以保证从foreach获得相同的顺序.例如,依靠它按顺序迭代List是完全合理的. (2认同)