В каком порядок делает C# для каждого цикла, выполняют итерации по Списку <T>?

Я загрузил Ваш код, и все работает как ожидалось.

отладчик Visual Studio правильно прерывает все исключения. Блоки выгоды работают как ожидалось.

я выполняю сервер Windows 2003 SP2, Комплект Команды VS2008 (9.0.30729.1 SP)

, я пытался скомпилировать Вас проект для.NET 2.0, 3,0 & 3.5

@Steve Steiner, параметры отладчика, которые Вы упомянули, не имеют никакого отношения к этому поведению.

я пытался играть с этими опциями без видимых эффектов - блокам выгоды удалось прервать все исключения.

76
задан Machavity 26 January 2019 в 03:03
поделиться

4 ответа

В основном это зависит от реализации IEnumerator , но для списка List < T> он всегда будет идти в естественном порядке списка, то есть в том же порядке, что и индексатор: список [0] , список [1] ​​, list [2] и т. д.

Я не верю, что это явно задокументировано - по крайней мере, я не нашел такой документации - но я думаю, вы можете рассматривать это как гарантированное. Любое изменение этого порядка приведет к бессмысленному нарушению всех видов кода. Фактически, я был бы удивлен, если бы увидел любую реализацию IList , которая этому не подчиняется. По общему признанию, было бы неплохо увидеть это специально задокументированным ...

94
ответ дан 24 November 2019 в 11:20
поделиться

В вашей ссылке принятый ответ указывает в Спецификация языка C # версии 3.0, стр. 240 :

Порядок, в котором проходит foreach элементы массива, как следующим образом: Для одномерных массивов элементы пересекаются при увеличении порядок индекса, начиная с индекса 0 и оканчивается индексом Длина - 1. Для многомерные массивы, элементы пройдено так, что индексы крайнее правое измерение увеличено сначала, затем следующее левое измерение, и так далее слева. Последующий пример распечатывает каждое значение в двумерный массив, в элементе заказ:

 using System;
класс Test
{
 static void Main () {
 double [,] values ​​= {
 {1.2, 2.3, 3.4, 4.5},
 {5.6, 6.7, 7.8, 8.9}
 };
 foreach (двойное значение elementValue в значениях)
 Console.Write ("{0}", elementValue);
 Console.WriteLine ();
 }
}

Результат выглядит следующим образом: 1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,9 В примере

 int [] numbers = {1, 3, 5, 7, 9};
foreach (var n в числах) Console.WriteLine (n);
предполагается, что тип n будет int, типом элемента чисел.
8
ответ дан 24 November 2019 в 11:20
поделиться

Порядок определяется итератором, который используется для обхода коллекции данных с помощью цикла foreach.

Если вы используете стандартную коллекцию, которая является индексируемой (например, список), затем он будет перемещаться по коллекции, начиная с индекса 0 и двигаясь вверх.

Если вам нужно управлять упорядочением, вы можете либо управлять тем, как обрабатывается итерация коллекции, реализуя свой собственный IEnumerable , либо вы может отсортировать список так, как вы хотите, перед выполнением цикла foreach.

Это объясняет, как Enumerator работает для общего списка. Сначала текущий элемент не определен и использует MoveNext для перехода к следующему элементу.

4
ответ дан 24 November 2019 в 11:20
поделиться

Похоже, что списки возвращают элементы в том порядке, в котором они находятся в резервном хранилище, поэтому, если они добавлены в список таким образом, они будут возвращены в том же порядке.

Если ваш Программа зависит от порядка, вы можете отсортировать ее перед перемещением по списку.

Это несколько глупо для линейного поиска, но если вам нужен определенный порядок, лучше всего расположить элементы в этом порядке.

1
ответ дан 24 November 2019 в 11:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: