В каком порядке C# для каждого цикла повторяется по списку?



мне было интересно, в каком порядке цикл foreach в C# проходит через

656   5  

5 ответов:

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

Я не верю, что это явно не задокументировано - по крайней мере, я не нашел такой документации, но я думаю, что вы можете рассматривать его как гарантированное. Любое изменение этого порядка будет бессмысленно нарушать все виды кода. На самом деле, я был бы удивлен, увидев любую реализацию IList<T> что ослушался этого. Конечно, было бы приятно видеть это оговорено...

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

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

using System;
class Test
{
  static void Main() {
      double[,] values = {
          {1.2, 2.3, 3.4, 4.5},
          {5.6, 6.7, 7.8, 8.9}
      };
      foreach (double elementValue in values)
          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 in numbers) Console.WriteLine(n);
the type of n is inferred to be int, the element type of numbers.

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

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

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

Это объясняет, как перечислитель работает для общего списка. Сначала текущий элемент не определен и использует 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

Comments

    Ничего не найдено.