按默认值创建一个TDictionary常量数组

5

我希望在Delphi项目中使用 TDictionary。但是我遇到了一个问题,如何创建一个默认值的常量数组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;
    ...

有没有人能给我一些建议?(如果我的英语不好,请原谅!)

2个回答

11

您不能编写一个类的实例作为常量表达式。

然而,由于您的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;

我以前做过类似的事情。


如果这将成为被接受的答案,它应该回答所提出的问题。稍作修改即可解决这个问题。 - David Heffernan
1
此外,您能否解释一下这种方法比问题中的代码更好在哪里?它增加了额外的措辞,但似乎没有明显的收益。您会使用这段代码而不是问题中的代码吗? - David Heffernan
@DavidHeffernan,感谢您的评论。我根据您的答案更新了我的答案。由于您已经提供了解释,我只是提供了一个解决方案。最初选择了您的答案,但OP转而选择了我的答案。 - Marcus Adams
没问题,这取决于提问者。但是最好接受的答案确实涵盖了问题的关键点。感谢更新。 - David Heffernan
我更喜欢在这里使用for value in array循环,而不是for integer from magic-index to function(some-array)。只是为了使它更加健壮。 - Arioch 'The

5

你不能编写一个类的实例作为常量表达式,因此你想尝试做的是不可能的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接