#delphi
Подскажите, как создать, и можно ли, массив где индексом будет строка?MyArray['index']? Если невозможно, то что за структура у TIBQuery с ее обращением IBQ['some_field_name'] ?
Ответы
Ответ 1
Сами по себе массивы не поддерживают строковые ключи. Однако, есть множество структур, которые предлагают такой функционал. Одним из распространенных решений для хранений пар ключ-значение, используемых в компонентах являются различные наследники класса TStrings и наиболее часто используемый из них - TStringList из модуля classes. sl := TStringList.Create(); try sl.values['index'] := 'qwe'; writeln(sl.Values['index']); finally sl.Free(); end; В целом же основной структурой данных в похожих ситуациях является словарь TDictionary. Это обобщенный (дженерик, generics, шаблонный) тип с параметризованными типами ключей и значений. Например, для хранения строковых ключей и целочисленных значений можно использовать следующий код. d := TDictionary .Create(); try d.AddOrSetValue('key', 123); writeln(d['key']); finally d.Free(); end; Словари, наравне со списками TList, стэком TStack и очередями TQueue являются основным структурами хранения данных. Их функционал достаточно обширен. Что касается индексированного доступа к некоторым данным объекта это может быть реализовано и вручную в любом классе. Для этого необходимо реализовать индексное свойство, и добавить к нему модификатор default. Очевидно, что default-свойство, позволяющее не указывать имя свойства при обращении, может быть только одно. TTest = class(TObject) private function getValue(key:string):integer; procedure setValue(key: string; value: integer); public property Values[key: string]: integer read getValue write setValue; default; end; Реализацию методов get/set-value оставим максимально простой. function TTest.getValue(key: string):integer; begin result := 123; end; procedure TTest.setValue(key:string; value : integer); begin raise Exception.Create('not implemented'); end; В данной реализации любое обращение по строковому ключу будет возвращать значение 123: t := TTest.Create(); try writeln(t['index']); finally t.Free(); end;
Комментариев нет:
Отправить комментарий