HMcG
HMcG

Reputation: 2060

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?

Upvotes: 17

Views: 29116

Answers (3)

RichardTheKiwi
RichardTheKiwi

Reputation: 107716

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.

Upvotes: 13

jachguate
jachguate

Reputation: 17203

In math, a set have no particular order.

In pascal, a set is a bitmap in memory representation of the elements present in the set (within a universe of possible elements defined by the base type).

There's no way you can "change" the order of a set, because it is, by definition, meaningless for it.

As the in memory representation by pascal, the set is always iterated "in order".

Upvotes: 8

Rob Kennedy
Rob Kennedy

Reputation: 163287

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.

Upvotes: 25

Related Questions