我应该使用什么类型的收藏?德尔福

时间:2017-12-31 19:07:42

标签: delphi key tdictionary

我想在Delphi中使用一个键来表示两个值,比如这个

TDictionary<tkey, tfirstvalue,tsecondvalue>;

3 个答案:

答案 0 :(得分:2)

将您的值放入像记录一样的复合结构中。然后使用该记录类型作为字典值类型。

答案 1 :(得分:1)

Delphi没有Tuple类型。 我不知道你的目的,但可能是动态的记录类型帮助。

Type
Tdict_ = reocord
 tkey:integer;
tfirstvalue,Tsecondvalue :string;
end;
var
Tdict:array of tdict_
...
procedure adddata(Tkey:integer;tfirstvalue:string;Tsecondvalue :string); 
begin
     setlength(tdict,length(tdict)+1);
    tdict[length(tdict)-1].tkey:=tkey;
    tdict[length(tdict)-1].tfirstvalue:=tfirstvalue;
    tdict[length(tdict)-1].tsecondtvalue:=tsecondvalue;    
end;

但你必须写自己的&#34;发现&#34;函数返回数组的索引。

例如

    Function find(tkey:integer):integer;
    var i:Integer;
    begin
     for i:=0 to length(Tdict)-1 do
     if tdict[i].tkey=i then
       begin
        result:=i;
        break;
       end;
    end;

    Function deletecalue(tkey:integer):integer;
    var i,j:Integer;
    begin
     i:=find(tkey)
        for j:=i to length(Tdict)-2 do
           tdict[j]:=tdict[j+1];
        setlength(tdict,length(tdict)-1);

    end;

如果键是字符串类型必须更改,但对于大日期来说它会很慢。

另请阅读: https://github.com/malcolmgroves/generics.tuples

答案 2 :(得分:0)

正如 @RudyVelthuis 所述,

TDictionary<TKey, TPair<TFirstValue, TSecondValue>>是可行的。但是,TPair(可在 System.Generics.Collections 中找到)并不意味着–两个值分别称为 Key Value ,在这里没有意义。我们应该复制TPair,可以将其命名为TTuple

然后您可以进行MyDictionary.Add('key', TTuple<string, string>.Create('firstvalue', 'secondvalue'));

由于它是作为record值类型)实现的,因此无需释放它。