Создать постоянный массив TDictionary по умолчанию

Я хочу использовать a TDictionary в проекте Delphi. Но у меня проблема, как я могу создать постоянный массив TDictionary по умолчанию?

Например, я хочу выделить 4 элемента для словаря, такого как приведенный ниже код (для постоянного массива TItem):

...
type
  TItem = record
    _Key: string;
    _Value: string;
  end;
var
  Dic: array [0..3]of TItem=(
  (_Key:'A' ; _Value:'Apple'),
  (_Key:'B' ; _Value:'Book'),
  (_Key:'C' ; _Value:'C++'),
  (_Key:'D' ; _Value:'Delphi')
  );
...

Есть ли способ сделать эту работу с TDictionary? Я хочу создать постоянный массив Dic (но), например структуру ниже.

  ...
    var
      Dic: TDictionary<string, string>;
    begin
      Dic := TDictionary<string, string>.Create;
      try
        Dic.Add('A', 'Apple');
        Dic.Add('B', 'Book');
        Dic.Add('C', 'C++');
        Dic.Add('D', 'Delphi');
      finally
         ///
      end;
    ...

У кого-нибудь есть совет для меня? (Извините, если мой английский плохой!)


person Behrooz    schedule 29.10.2013    source источник


Ответы (2)


Вы не можете написать константное выражение, которое является экземпляром класса.

Тем не менее, поскольку ваш TDictionary представляет собой набор String, который представляет собой тип, с которым вы можете создавать константы, вы можете просто построить свой TDictionary во время выполнения из ваших констант. Вы можете использовать записи, как в вашем вопросе, но мне нравятся массивы:

{$IFDEF WHATEVER}
type
  TDictConstant = array[0..3, 0..1] of String;
const
  DICT_CONSTANT: TDictConstant = (('A', 'Apple'), ('B', 'Book'), ('C', 'C++'), ('D', 'Delphi'));
{$ELSE}
// If you want it "blank" for one config
type
  TDictConstant = array[0..0, 0..1] of String;
const
  DICT_CONSTANT: TDictConstant = (('', ''));
{$ENDIF}
var
  Dic: TDictionary<string, string>;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  Dic := TDictionary<string, string>.Create;
  for i := 0 to High(DICT_CONSTANT) do
  begin
    // Ignore the "blank" ones
    if (DICT_CONSTANT[i][0] <> '') or (DICT_CONSTANT[i][1] <> '') then
    begin
      Dic.Add(DICT_CONSTANT[i][0], DICT_CONSTANT[i][1]);
    end;
  end;
end;

Я делал подобное в прошлом.

person Marcus Adams    schedule 29.10.2013
comment
Если это будет принятый ответ, он должен ответить на вопрос, который был задан. Небольшое редактирование может исправить это. - person David Heffernan; 29.10.2013
comment
Кроме того, не могли бы вы объяснить, чем это лучше, чем код в вопросе. Это добавляет лишних формулировок к тому, что, кажется, не дает заметной выгоды. Вы бы использовали этот код, а не тот, что в вопросе? - person David Heffernan; 30.10.2013
comment
@DavidHeffernan, спасибо за комментарии. Я обновил свой ответ от вашего. Поскольку вы уже предоставили объяснение, я просто предложил решение. Изначально был выбран ваш ответ, но ОП переключился на мой. - person Marcus Adams; 30.10.2013
comment
Это нормально. Это зависит от спрашивающего. Но лучше, если принятый ответ закроет суть вопроса. Спасибо за обновления. - person David Heffernan; 30.10.2013
comment
Я бы предпочел здесь цикл for value in array, а не for integer from magic-index to function(some-array). Просто чтобы он был менее хрупким. - person Arioch 'The; 31.10.2013

Вы не можете написать константное выражение, которое является экземпляром класса. Итак, то, что вы пытаетесь сделать, невозможно.

person David Heffernan    schedule 29.10.2013