我该如何使用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帮助文档在描述枚举器(enumerator)和TEnumerator的工作原理方面非常简略,并且没有我能找到的示例。关于在Delphi中使用泛型与枚举器的方法,网络上也很少有相关内容。
而且,我的示例代码甚至没有使用TEnumerator,因此我对这一切的设计方式感到困惑。
谢谢Barry,感谢你的回答。
自从我提出这个问题以来,我开始了对泛型的探索。我想在我的代码中开始实现它们。"排序"问题有点令人困惑,因为泛型似乎具有处理排序的内置方法,但没有好的示例或文档说明如何做到这一点。
最后,我按照Barry的建议,在字典中构建了一个外部索引。不过,这并不感觉很正确。
然而,之后我又有了一个惊喜:我试图用泛型的TDictionary替换Gabr的GPStringHash。使用泛型使代码更加简洁。但是,TDictionary比Gabr的慢了3倍以上。尝试1,704,667次TryGetValue花费了0.45秒,但是相同的操作在Gabr的程序中只花费了0.12秒。我不确定原因,但也许就是Gabr拥有更快的哈希函数和桶组合。或者泛型必须为每种情况进行泛化,这本质上会减慢速度。
无论如何,也许Barry或其他Delphi开发人员应该看看这个问题,因为3倍的加速最终可能会使每个人受益。如果可以选择,我个人更愿意使用语言内置的内容,而不是第三方包(即使像Gabr这样好)。但现在,我会坚持使用GPStringHash。