Является ли выражение .NET foreach гарантированным итерировать коллекцию в том же порядке, в котором она была построена?

Сотрудник использовал цикл for для перебора списка в некотором коде С#, который он написал, и оставил комментарий: "did't use For Each, потому что я не был уверен, что он итерации по порядку. Кто знает, что сделает Microsoft". Например, предположим, что у нас есть список, подобный этому:

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 проходил массив или объект коллекции в любом порядке, отличном от нижнего предела до самого высокого?

Ответы

Ответ 1

Ваш вопрос касается List<T>, который поддерживает порядок.

foreach, один, не гарантирует ничего. Он просто запрашивает объект, предоставленный для его счетчика, который мог бы сделать что угодно, возможно.

Ответ 2

Это зависит от коллекции:

  • Для List<T> он гарантирует, что будет порядок вставки. (Предположим, что только теги Add, как показано. Если вы вставляете элементы в список в определенных местах, они будут возвращаться в нужном месте, как вы ожидали.) В основном это тот же порядок, что и вы, взяв list[0], list[1], list[2] и т.д.
  • Для Dictionary<TKey, TValue> нет гарантированного упорядочения.
  • Для SortedList<TKey, TValue> (и т.п.) он будет в ключевом порядке сравнения - это точка типа.
  • Массивы всегда выходят в порядке элементов.

Ответ 3

Чтобы ответить на вопрос, "foreach" возвращает порядок, возвращаемый. GetEnumerator(). Для списков это порядок, который вы добавили в конце. Для словарей это, вероятно, порядок ведер, где были назначены вещи.