加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 10:14:21 所属栏目:大数据 来源:网络整理
导读:如何使用TEnumerator按照按顺序排列我的TDictionary? 我有这样的东西: var Dic: TDictionarystring,string; Enum: TPairstring,string; begin Dic := TDictionarystring,string.create; Dic.Add('Tired','I have been working on this too long'); Dic.Add
如何使用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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读