Ассоциативный массив в Delphi, массив со строковым ключом возможен?

Если вы работаете с php, вы можете увидеть, что php имеет ассоциативный массив (или ключ строки ширины массива) в программировании lang. Например:

$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 ответов


для этой цели можно использовать tStrings и tStringList, но 2d-массивы выходят за рамки этих компонентов.

использование;

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

можно использовать TDictionary<string,string> С Generics.Collections единица.

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.


Я решил проблему таким простым способом (пример):

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


посмотреть единица массивы. Вы можете использовать ассоциативные массивы, которые хранят предопределенный тип данных (integer, string, boolean, float) или любой из них. Например, ниже я определяю ассоциативный массив поплавков:

uses ArrayS;

var floats : IFltArray;

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

и так далее.