Delphi for..in循环设置枚举顺序

时间:2011-02-09 20:33:17

标签: delphi enumeration

我想迭代一组特定的值。下面的简单例子

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 个答案:

答案 0 :(得分:19)

集合不是有序容器。您无法更改集合内容的顺序。 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.

答案 1 :(得分:11)

您可以声明一个常量数组而不是常量数组。

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.

答案 2 :(得分:5)

在数学中,一组没有特定的顺序。

在pascal中,集合是集合中存在的元素的内存表示中的bitmap(在由基类型定义的可能元素的范围内)。

你无法“改变”一组的顺序,因为根据定义,它对它毫无意义。

作为pascal的内存表示,该集合总是“按顺序”迭代。