delphi - delphi中的TDictionary奇怪行为

标签 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 上进行测试,结果相同。

感谢您的帮助。

最佳答案

Delphi 字典类是无序的。它的行为符合设计。如果您希望保持顺序,那么您需要使用有序数据结构。例如数组或列表。

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

关于delphi - delphi中的TDictionary奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41414723/

相关文章:

delphi - 此内存泄漏的根源是什么(使用 TCollection 时)

Delphi 2009类/组件读/写文件权限

delphi - TJvDockServer 和可停靠控件

c++ - 通过引用将数组从 Delphi 7 传递到 C++ Dll

将定义从 C 转换为 Delphi

delphi - 如何中止 TWeBrowser 导航进度?

delphi - 在 TEdgeBrowser 中启用单点登录

delphi - 在 D2009+ 中使用 TMemoryStream 和 TClipboard 复制/粘贴

delphi - 在 Delphi 中使用静态文本代替标签有什么优点?

excel - Delphi 控制 Excel - 创建数据透视表和图表