TDictionary在delphi中的奇怪行为

时间:2017-01-01 10:15:34

标签: delphi

我有以下问题:

我用一些值填充一个字典,并希望按照我填充它们的相同顺序将它们恢复。

不知怎的,它似乎没有工作,当我遍历项目时,他们按非逻辑顺序(IMDO)排序。

运行以下程序后:

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, System.Generics.Collections;
var
  Dictionary: TDictionary<LongWord, string>;
  aPair: TPair<LongWord, string>;
begin
  Dictionary := TDictionary<LongWord, string>.Create;
  Dictionary.add(1, 'First Item');
  Dictionary.add(2, 'Second Item');
  Dictionary.add(3, 'Third Item');
  Dictionary.add(4, 'Forth Item');
  Dictionary.add(5, 'Fifth Item');
  Dictionary.add($FFFFFFFF, 'Longword Item');

  for aPair in Dictionary do
    writeln(aPair.Value);

  readln;
end.

我得到了以下结果:

Forth Item
Longword Item
First Item
Third Item
Second Item
Fifth Item

我做错了吗?

在XE5和Rad Studio Berlin上测试,结果相同。

感谢您的帮助。

1 个答案:

答案 0 :(得分:6)

Delphi字典类是无序的。它的行为与设计一致。如果您希望维护订单,则需要使用有序数据结构。例如,数组或列表。

如果您希望有序访问以及O(1)查找,那么您需要串联维护两个集合。一个用于有序访问的数组或列表,以及用于O(1)查找的字典串联。或者,或者,找到提供有序字典实现的库。