Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Delphi for..in loop set enumeration order

I want to iterate through a set of specific values. Simple example below

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.

The sample code here does what I expect and produces the following

Iteration = 1, value = 1

Iteration = 2, value = 5

Iteration = 3, value = 10

Iteration = 4, value = 20

Now if I change the order of the set

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

The output is the same as the original, that is the order of the values is not preserved.

What is the best way to implement this?

like image 981
HMcG Avatar asked Feb 09 '11 20:02

HMcG


2 Answers

Sets are not ordered containers. You cannot change the order of a set's contents. A for-in loop always iterates through sets in numerical order.

If you need an ordered list of numbers, then you can use an array or 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.
like image 134
Rob Kennedy Avatar answered Oct 18 '22 17:10

Rob Kennedy


You can declare a constant array instead of a constant set.

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.
like image 43
RichardTheKiwi Avatar answered Oct 18 '22 19:10

RichardTheKiwi