开发者

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;
    w开发者_开发问答riteln('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?


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.


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.


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".

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜