Мне было интересно узнать, в каком порядке цикл foreach в C # проходит через System.Collections.Generic.List<T>
объект.
Я нашел еще один вопрос по той же теме, но не думаю, что он удовлетворит меня ответом на мой вопрос.
Кто-то заявляет, что порядок не определен. Но, как утверждает кто-то другой, порядок обхода массива фиксирован (от 0 до Length-1). 8.8.4 Оператор foreach
Также было сказано, что то же самое верно для любых стандартных классов с порядком (например List<T>
). Я не могу найти никакой документации, подтверждающей это. Итак, насколько я знаю, сейчас это может работать так, но, возможно, в следующей версии .NET все будет по-другому (хотя это может быть маловероятно).
Я также безуспешно смотрел List(t).Enumerator
документацию.
Другой связанный с этим вопрос гласит, что для Java это специально упоминается в документации:
List.iterator()
возвращает итератор по элементам в этом списке в правильной последовательности. "
Я ищу что-то подобное в документации по C #.
Заранее спасибо.
Изменить: Спасибо вам за все ваши ответы (удивительно, как быстро я получил так много ответов). Из всех ответов я понимаю, что List<T>
всегда выполняется итерация в порядке индексации. Но я все же хотел бы видеть четкую документацию, заявляющую об этом, аналогичную документации по JavaList
.
источник
foreach
определенно будет повторяться по порядку с массивом.В вашей ссылке принятый ответ указывает в Спецификации языка C # версии 3.0, стр. 240 :
источник
Порядок определяется итератором, который используется для обхода коллекции данных с помощью цикла foreach.
Если вы используете стандартную индексируемую коллекцию (например, List), то она будет проходить по коллекции, начиная с индекса 0 и двигаясь вверх.
Если вам нужно управлять порядком, вы можете либо контролировать, как обрабатывается итерация коллекции, реализуя собственный IEnumerable , либо отсортировать список так, как вы хотите, перед выполнением цикла foreach.
Это объясняет, как Enumerator работает для общего списка. Сначала текущий элемент не определен и использует MoveNext для перехода к следующему элементу.
Если вы читаете MoveNext, это означает, что он начнется с первого элемента коллекции и оттуда перейдет к следующему, пока не достигнет конца коллекции.
источник
Похоже, что списки возвращают элементы в том порядке, в котором они находятся в резервном хранилище, поэтому, если они добавлены в список таким образом, они будут возвращены таким образом.
Если ваша программа зависит от порядка, вы можете отсортировать ее перед просмотром списка.
Это несколько глупо для линейного поиска, но если вам нужен определенный порядок, лучше всего расположить элементы в этом порядке.
источник
Мне просто пришлось сделать что-то подобное, например, быстрый взлом кода, хотя это не сработало для того, что я пытался сделать, это изменило порядок списка для меня.
Использование LINQ для изменения порядка
DataGridViewColumn[] gridColumns = new DataGridViewColumn[dataGridView1.Columns.Count]; dataGridView1.Columns.CopyTo(gridColumns, 0); //This created a list of columns gridColumns = (from n in gridColumns orderby n.DisplayIndex descending select n).ToArray(); //This then changed the order based on the displayindex
источник
List
. Я думаю, вы неправильно поняли, что я имел в виду под словом «список».Columns
вgridColumns
? Я думаю, что вы также могли бы просто сделать:DataGridViewColumn[] gridColumns = dataGridView1.Columns.OrderByDescending(n => n.DisplayIndex).ToArray();