Ассоциативный массив в 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'] );
и так далее.