如何使用 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 中建立了一个外部索引。不过,感觉还是不太对。
然而,我有另一个惊喜:我试图用通用的 TDictionary 替换Gabr的GPStringHash。使用泛型的代码更简洁一些。但底线是 TDictionary 比 Gabr 慢 3 倍多。对 TryGetValue 的 1,704,667 次调用耗时 0.45 秒,但对 Gabr 例程的相同操作耗时 0.12 秒。我不知道为什么,但也许它就像 Gabr 一样简单,具有更快的哈希函数和分桶组合。或者,也许泛型必须针对每种情况进行泛化,这本质上会减慢速度。
尽管如此,也许 Barry 或其他 Delphi 开发人员应该看看这一点,因为 3 倍的加速最终可以使每个人受益。如果可以选择,我个人会更早地使用语言中内置的内容,而不是第三方包(甚至与 Gabr 的包一样好)。但现在,我会坚持使用 GPStringHash。