Гарантируется ли оператор .NET foreach повторять коллекцию в том же порядке, в котором она была построена? - PullRequest
15 голосов
/ 05 марта 2009

Сотрудник использовал цикл for для итерации List в некотором коде C #, который он написал, и оставил комментарий: «Не использовал 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 проходил через массив или коллекцию объектов в любом порядке, кроме как от самой нижней границы до самой высокой?

Ответы [ 3 ]

33 голосов
/ 05 марта 2009

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

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

23 голосов
/ 05 марта 2009

Зависит от коллекции:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...