gpt4 book ai didi

delphi - 在 Delphi 2009 中如何按字母顺序按键列出 TDictionary?

转载 作者:行者123 更新时间:2023-12-03 14:34:45 28 4
gpt4 key购买 nike

如何使用 TEnumerator 按键排序顺序浏览我的 TDictionary?

我有这样的东西:

  var
Dic: TDictionary<string, string>;
Enum: TPair<string, string>;

begin
Dic := TDictionary<string, string>.create;
Dic.Add('Tired', 'I have been working on this too long');
Dic.Add('Early', 'It is too early in the morning to be working on this');
Dic.Add('HelpMe', 'I need some help');
Dic.Add('Dumb', 'Yes I know this example is dumb');

{ I want to do the following but do it in sorted order by Enum.Key }
for Enum in Dic do
some processing with Enum.Key and Enum.Value;

Dic.Free;
end;

所以我想按顺序处理我的字典:Dumb、Early、HelpMe、Tired。

不幸的是,Delphi 的帮助在描述一般枚举器和 TEnumerator 具体如何工作方面非常少,并且没有给出我能找到的示例。网上关于在 Delphi 中使用枚举器和泛型的文章也很少。

我上面的示例代码甚至没有使用 TEnumerator,所以我很困惑这一切是如何设计的。

<小时/>

谢谢巴里的回答。

自从我提出这个问题以来,我对泛型的探索很有趣。我想开始在我的代码中实现它们。 “排序”问题有点令人困惑,因为似乎泛型似乎有处理内置排序的方法,但没有关于如何做到这一点的好的示例或文档。

最后我按照 Barry 的建议在 Dictionary 中建立了一个外部索引。不过,感觉还是不太对劲。

但是,然后我又感到惊讶:我试图替换 GabrGPStringHash与 Generic 的 TDictionary 一起使用。使用泛型后,代码更加简洁。但底线是 TDictionary 比 Gabr 慢 3 倍多。对 TryGetValue 的 1,704,667 次调用花费了 0.45 秒,但对 Gabr 例程的相同操作花费了 0.12 秒。我不知道为什么,但也许它就像 Gabr 拥有更快的哈希函数和分桶组合一样简单。或者也许泛型必须针对每种情况进行概括,这本质上会减慢速度。

尽管如此,也许 Barry 或其他 Delphi 开发人员应该考虑一下这一点,因为 3 倍的加速最终可以使每个人受益。如果可以选择的话,我个人会更早地使用该语言内置的内容,而不是使用第 3 方包(即使是像 Gabr 那样好的包)。但现在,我将坚持使用 GPStringHash。

最佳答案

字典是一个哈希表,因此它不按排序顺序存储项目。 TEnumerator 很简单 - 它只是迭代项目的一种方法。

要获取订单中的商品,您需要对它们进行排序。一种方法是将它们放入列表中并对列表进行排序,如下所示:

var
list: TList<string>;
begin
list := TList<string>.Create(Dic.Keys);
try
list.Sort;
// process sorted list of items now
finally
list.Free;
end;
end;

关于delphi - 在 Delphi 2009 中如何按字母顺序按键列出 TDictionary?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2528265/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com