Delphi for..in цикл набора порядок перечисления - PullRequest
13 голосов
/ 09 февраля 2011

Я хочу перебрать набор определенных значений. Простой пример ниже

program Project1;
{$APPTYPE CONSOLE}

var
  a, b: word;
  wait: string;

begin
  a := 0;
  for b in [1,5,10,20] do
  begin
    a := a + 1;
    writeln('Iteration = ', a, ',   value = ', b);
  end;

  read(wait); 

end.

Пример кода здесь делает то, что я ожидаю, и выдает следующее

Итерация = 1, значение = 1

Итерация = 2, значение = 5

Итерация = 3, значение = 10

Итерация = 4, значение = 20

Теперь, если я изменю порядок набора

  for b in [20,10,5,1] do

Вывод такой же, как и у оригинала, то есть порядок значений не сохраняется.

Каков наилучший способ реализовать это?

Ответы [ 3 ]

20 голосов
/ 09 февраля 2011

Наборы не заказанные контейнеры.Вы не можете изменить порядок содержимого набора.Цикл for-in всегда перебирает множества в числовом порядке.

Если вам нужен упорядоченный список чисел, вы можете использовать массив или TList<Integer>.

var
  numbers: array of Word;
begin
  SetLength(numbers, 4);
  numbers[0] := 20;
  numbers[1] := 10;
  numbers[2] := 5;
  numbers[3] := 1;
  for b in numbers do begin
    Inc(a);
    Writeln('Iteration = ', a, ',   value = ', b);
  end;
end.
11 голосов
/ 09 февраля 2011

Вы можете объявить массив констант вместо набора констант.

program Project1;
{$APPTYPE CONSOLE}

var
  a, b: word;
  wait: string;
const
  values: array[0..3] of word = (20,5,10,1);

begin
  a := 0;
  for b in values do
  begin
    a := a + 1;
    writeln('Iteration = ', a, ',   value = ', b);
  end;

  read(wait);

end.
5 голосов
/ 09 февраля 2011

В математике у набора нет определенного порядка.

В паскале набор представляет собой bitmap в памяти представление элементов, присутствующих в наборе (во вселенной возможных элементов, определенных базовым типом).

Нет способа, которым вы можете «изменить» порядок набора, потому что он по определению для него не имеет смысла.

Как и в представлении Паскаля в памяти, множество всегда повторяется «по порядку».

...