Delphi中的关联数组,带字符串键的数组是否可行?

时间:2012-12-07 15:00:43

标签: arrays delphi key associative delphi-xe3

如果使用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一样,但还有更好的方法吗?

4 个答案:

答案 0 :(得分:17)

您可以使用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>的操作方式与传统的TObjectList相同,OwnsObjects设置为True

答案 1 :(得分:10)

您可以使用tStrings和tStringList来实现此目的,但是2d数组不在这些组件的范围内。

用法;

var
  names  : TStrings;
begin
  ...
  names := TStringList.Create;
  ...
  ...
  names.values['ABC'] = 'VALUE of ABC' ;
  ...
  ...
end ;

答案 2 :(得分: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 功能的关联数组。

优点是它很简单,每当我们向数组添加元素时,我们都不需要在程序的不同位置更改代码。

答案 3 :(得分:0)

查看ArrayS unit。您可以使用存储预定义类型的数据(整数,字符串,布尔值,浮点数)或其中任何一种的关联数组。例如,下面我定义了一个浮点数的关联数组:

uses ArrayS;

var floats : IFltArray;

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

以此类推。