如何使用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中建立一个外部索引。不过,它感觉不对。
然而,我又有一个惊喜:我试图用Generic的TDictionary替代Gabr的GPStringHash。代码与泛型有点清洁。但是底线是TDictionary比Gabr慢3倍以上。 1,704,667次对TryGetValue的调用花了.45秒,但与Gabr的例程相同的操作花费了0.12秒。我不知道为什么,但也许它像Gabr一样简单,具有更快的哈希功能和强化组合。或者也许仿制药必须对每一种情况进行概括,并且固有地减缓它。
巴里或其他德尔福开发商应该看看这一点,因为3倍加速可能最终使每个人都受益。如果给予选择,我会亲自使用语言内置的内容,而不是第三方软件包(甚至与Gabr的一样)。但是现在,我会坚持使用GPStringHash。
解决方法
在我的情况下,我使用TDictionary<字符串,字符串> .TKeyCollection类。
function compareKey(const L,R: String): Integer; begin Result := SysUtils.CompareText(L,R); end; function getReverseSortedKeyArray(dictionary: TDictionary<String,String): TArray<String>; var keyArray: TArray<String>; keyCollecttion: TDictionary<String,String>.TKeyCollection; begin keyCollecttion:= TDictionary<String,String>.TKeyCollection.Create(dictionary); try keyArray:= valueCollecttion.ToArray; TArray.Sort<String>(keyArray,TComparer<String>.Construct(compareKey)); finally keyCollecttion.Free; end; Result := keyArray; end;
使用示例:
var key: String; keyArray : TArray<String>; begin keyArray := getSortedKeyArray (dictionary); for key in keyArray do begin // ... end; end;