Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 我应该使用什么类型的集合?德尔菲_Delphi_Key_Tdictionary - Fatal编程技术网

Delphi 我应该使用什么类型的集合?德尔菲

Delphi 我应该使用什么类型的集合?德尔菲,delphi,key,tdictionary,Delphi,Key,Tdictionary,我想在Delphi中使用一个键来表示两个值 TDictionary<tkey, tfirstvalue,tsecondvalue>; t词典; 将您的值放入一个类似于记录的复合结构中。然后将该记录类型用作字典值类型 将您的值放入一个类似于记录的复合结构中。然后将该记录类型用作字典值类型 Delphi没有元组类型。 我不知道你的目的,但是记录类型的动态数组可能会有帮助 Type Tdict_ = reocord tkey:integer; tfirstvalue,Tsecondva

我想在Delphi中使用一个键来表示两个值

TDictionary<tkey, tfirstvalue,tsecondvalue>;
t词典;

将您的值放入一个类似于记录的复合结构中。然后将该记录类型用作字典值类型

将您的值放入一个类似于记录的复合结构中。然后将该记录类型用作字典值类型

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

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;
但您必须为数组的返回索引编写自己的“find”函数

比如说

    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;
若键是字符串,则必须更改类型,但对于大型日期来说,这将很慢

还请阅读以下内容: Delphi没有元组类型。 我不知道你的目的,但是记录类型的动态数组可能会有帮助

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;
但您必须为数组的返回索引编写自己的“find”函数

比如说

    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;
若键是字符串,则必须更改类型,但对于大型日期来说,这将很慢

还请阅读以下内容: 正如@RudyVelthuis所评论的那样,词典是可能的,并且是有效的。然而,
TPair
(在System.Generics.Collections中找到)并不是这个意思-这两个值被命名为KeyValue,这在这里没有意义。我们应该复制一份
TPair
,它可以命名为
TTuple

然后可以执行MyDictionary.Add('key',TTuple.Create('firstvalue','secondvalue')

由于它是作为一个
记录(值类型)实现的,因此不需要释放它。

TDictionary
,正如@RudyVelthuis所评论的,是可能的,并且是有效的。然而,
TPair
(在System.Generics.Collections中找到)并不是这个意思-这两个值被命名为KeyValue,这在这里没有意义。我们应该复制一份
TPair
,它可以命名为
TTuple

然后可以执行MyDictionary.Add('key',TTuple.Create('firstvalue','secondvalue')


由于它是作为
记录实现的
(值类型),因此没有必要释放它。

是什么阻止您使用元组作为键?在c#netfram 4中使用了元组,但我想在Delphi中使用dynarray作为键的值呢?还是有两个值的记录?然后它就变成了类似于
t字典的东西,这应该是可行的。或者使用
TPair
作为值类型(无论如何相当于2类型记录)。@DavidStockinger:Delphi没有内置元组。可以使用其他可用的数据类型轻松地模拟它们,但它们不作为内置类型存在。换句话说,这些值可以通过多种方式轻松组合为单个类型(包含多个值)。TValue部分可以根据需要任意大,因此可以有1:1和1:多的关系。如果你想拥有不同的键类型,或者每个值有多个键(many:many),或者诸如此类的话,这只会让人感到毛骨悚然,因为Dictionary并不是为这个而设计的。是什么阻止你使用元组作为键呢?在c#netfram 4中使用了元组,但我想在Delphi中使用dynarray作为键的值呢?还是有两个值的记录?然后它就变成了类似于
t字典的东西,这应该是可行的。或者使用
TPair
作为值类型(无论如何相当于2类型记录)。@DavidStockinger:Delphi没有内置元组。可以使用其他可用的数据类型轻松地模拟它们,但它们不作为内置类型存在。换句话说,这些值可以通过多种方式轻松组合为单个类型(包含多个值)。TValue部分可以根据需要任意大,因此可以有1:1和1:多的关系。只有当您想要有不同的键类型,或每个值有多个键(many:many)或类似的键时,才会出现问题,因为TDictionary并不是为此而设计的。