2009-03-04 5 views
14

Коллега использовал цикл for для перебора списка в некотором коде C#, который он написал, и оставил комментарий: «did't use For Each, потому что я не был уверен, что он итерации по порядку. Кто знает, что сделает Microsoft». Например, предположим, что у нас есть список застроенной так:Является ли заявление .NET foreach гарантированным итерировать коллекцию в том же порядке, в котором она была построена?

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

ответ

33

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

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

+3

+1 О, нет, эффект Скита дает вам меньше голосов. –

+0

Тестирование, чтобы увидеть, могу ли я преодолеть эффект Скита. Скрещенные пальцы. –

+4

У вас в настоящее время есть еще один, чем я, благодаря моему собственному преимуществу. Я предполагаю, что это не эффект Скита, который вы имели в виду;) –

22

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

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

Хотя вы правы, я все же утверждаю, что foreach ТОЛЬКО для итерации по всем объектам в коллекции и никоим образом не гарантирует никакого порядка. Это зависит от реализации коллекции, чтобы определить порядок, выбранный foreach. Поэтому использование foreach не имеет гарантированного поведения. – DevinB

+1

@devinb Я думаю, что это то, что @Jon говорит. –

+2

Ну, foreach гарантированно использует GetEnumerator из коллекции, поэтому, если вам известен порядок итератора коллекции, вам гарантирован тот же порядок от foreach. Например, вполне разумно полагаться на то, что он перебирает список в порядке, например. –

4

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

 Смежные вопросы

  • Нет связанных вопросов^_^