Delphi 我应该使用什么类型的集合?德尔菲
我想在Delphi中使用一个键来表示两个值Delphi 我应该使用什么类型的集合?德尔菲,delphi,key,tdictionary,Delphi,Key,Tdictionary,我想在Delphi中使用一个键来表示两个值 TDictionary<tkey, tfirstvalue,tsecondvalue>; t词典; 将您的值放入一个类似于记录的复合结构中。然后将该记录类型用作字典值类型 将您的值放入一个类似于记录的复合结构中。然后将该记录类型用作字典值类型 Delphi没有元组类型。 我不知道你的目的,但是记录类型的动态数组可能会有帮助 Type Tdict_ = reocord tkey:integer; tfirstvalue,Tsecondva
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中找到)并不是这个意思-这两个值被命名为Key和Value,这在这里没有意义。我们应该复制一份TPair
,它可以命名为TTuple
然后可以执行MyDictionary.Add('key',TTuple.Create('firstvalue','secondvalue')代码>
由于它是作为一个记录(值类型)实现的,因此不需要释放它。TDictionary
,正如@RudyVelthuis所评论的,是可能的,并且是有效的。然而,TPair
(在System.Generics.Collections中找到)并不是这个意思-这两个值被命名为Key和Value,这在这里没有意义。我们应该复制一份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并不是为此而设计的。