Associative array in Delphi , array with string key is possible?

A1Gard picture A1Gard · Dec 7, 2012 · Viewed 16.3k times · Source

If you work with php you can see the php have associative array (or array width string key) in programing lang. For example:

$server['hostname']  =  'localhost';
$server['database']  =  'test';
$server['username']  =  'root';
$server['password']  =  'password' ;    

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

But can't find any default way to use associative array in delphi.

First I want find default way with out any output component or class . Second if really I cant find with internal way I force choose output classes only.

I use Delphi XE3 , many thanks for your help.

edit: I found one class here : http://www.delphipages.com/forum/showthread.php?t=26334 same as php , but any better way?

Answer

David Heffernan picture David Heffernan · Dec 7, 2012

You can use TDictionary<string,string> from the Generics.Collections unit.

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;

And so on and so on.

If you want a dictionary that contains a dictionary, you can do use TDictionary<string, TDictionary<string,string>>.

However, when you do that you'll need to take special care over the lifetime of the dictionary items that are contained in the outer dictionary. You can use TObjectDictionary<K,V> to help manage that for you. You'd create one of these objects like this:

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

This TObjectDictionary<k,V> operates the same was as a traditional TObjectList with OwnsObjects set to True.