Delphi中的关联数组,使用字符串作为键是否可行?

8
如果您从事PHP开发,您会发现PHP具有关联数组(或带有字符串键的数组)。 例如:
$server['hostname']  =  'localhost';
$server['database']  =  'test';
$server['username']  =  'root';
$server['password']  =  'password' ;    

// 2d array
$all['myserver']['hostname'] = 'localhost' ;

但是在Delphi中找不到使用关联数组的默认方法。

首先,我想找到没有任何输出组件或类的默认方法。 其次,如果真的找不到内部方法,我只能强制选择输出类。

我使用的是Delphi XE3,非常感谢您的帮助。

编辑: 我在这里找到了一个类:http://www.delphipages.com/forum/showthread.php?t=26334 与PHP相同,但是否有更好的方法?


2
在Delphi中可以找到一个非常好的关联数组实现,链接在这里:https://dev59.com/6nDYa4cB1Zd3GeqPCJqF#15854846 。它与PHP的Assoc Array最相似。 - iPath ツ
@iPath:赞同并感谢 :) - A1Gard
4个回答

19

你可以从Generics.Collections单元使用TDictionary<string,string>

var
  Dict: TDictionary<string,string>;
  myValue: string;
....
Dict := TDictionary<string,string>.Create;
try
  Dict.Add('hostname', 'localhost');
  Dict.Add('database', 'test');
  //etc.
  myValue := Dict['hostname'];
finally
  Dict.Free;
end;

等等,等等。

如果你想要一个包含字典的字典,可以使用TDictionary<string, TDictionary<string,string>>

然而,这样做时,你需要特别注意外部字典中包含的字典项的生命周期。你可以使用TObjectDictionary<K,V>来帮助管理它。你可以像这样创建一个对象:

TObjectDictionary<string, TDictionary<string,string>>.Create([doOwnsValues]);

这个 TObjectDictionary<k,V> 的操作方式与传统的具有 OwnsObjects 设置为 TrueTObjectList 相同。


这里并不是完整的方法,我在这里找到了更好的方法:http://www.delphipages.com/forum/showthread.php?t=26334,但我想要完整的类,非常感谢David :) - A1Gard
2
我不理解那个评论。你要找的是我回答中描述的类。 - David Heffernan
1
tDictionary是在较新版本的Delphi中引入的。这个解决方案比我用tStrings给出的要好得多,因为tDictionary的实现比tStrings更好。 - Ali Avcı
我羡慕那些使用Delphi 2009及以上版本的人... 我被迫使用TStringList。 - Max Carroll
@MaxCarroll 是的,那真的不太有趣! - David Heffernan
显示剩余2条评论

14
您可以使用 tStrings 和 tStringList 来实现此目的,但是这些组件的范围不包括二维数组。
用法:
var
  names  : TStrings;
begin
  ...
  names := TStringList.Create;
  ...
  ...
  names.values['ABC'] := 'VALUE of ABC' ;
  ...
  ...
end ;

3
应该使用“:=”(赋值操作符),而不是“=”(比较两个值/对象的运算符)。 - Max Carroll

0
看看 ArrayS。您可以使用关联数组来存储预定义类型的数据(整数,字符串,布尔值,浮点数),或者它们的任何组合。例如,下面我定义了一个浮点数的关联数组:
uses ArrayS;

var floats : IFltArray;

floats := CreateArray;
floats['first'] := 0.1;
floats['second'] := 0.2;
writeln( floats['second'] );

等等。

更新于2020年3月15日

压缩源代码

俄语使用示例


404 抱歉,未找到相应内容。 - djdance
1
压缩的源代码用法示例,均为俄语。 - Ivan Z

0

我已经用简单的方法解决了这个问题(例如):

uses StrUtils;

...

const const_TypesChar : array [0..4] of String =
    (
      'I',
      'F',
      'D',
      'S',
      'B'
    );
const const_TypesStr : array [0..4] of String =
    (
      'Integer',
      'Float',
      'Datetime',
      'String',
      'Boolean'
    );

...

Value := const_TypesStr[ AnsiIndexStr('S', const_TypesChar) ];

// As an example, after execution of this code Value variable will have 'String' value.

//

在程序中,我们使用了两个数组const_TypesChar和const_TypesStr作为一个关联数组,并使用AnsiIndexStr函数。这样做的好处是简单,并且每次向数组添加元素时,我们无需更改程序中不同位置的代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接