使用关联字符串(键/值)的最简单方法是什么?

6

我有很多相关的常量,在某些情况下需要将它们配对,就像这样:

const
  key1 = '1';
  key2 = '2';
  key3 = '3';

  value1 = 'a';
  value2 = 'b';
  value3 = 'c';

我希望避免做以下事情:

if MyValue = key1 then Result := value1;

我知道如何使用字符串列表来完成这个任务:

MyStringList.Add(key1 + '=' + value1);
Result := MyStringList.Values[key1];

但是,有没有更简单的方法来做这件事呢?

Delphi(自2009年起)现在有一个TDictionary类来完成这个任务。 - awmross
3个回答

9

是的,可以通过这种方式来完成赋值操作,避免手动进行字符串拼接:

MyStringList.Values[Key1] := Value1;

使用StringList的值/名称可能会导致速度问题。当使用该方法时,所有搜索都是线性的,即使您对列表进行了排序。如果您只有少量数据,那么这没问题。但对于大量数据,请避免使用该技术。 - vIceBerg
谢谢,我忘记了这种方法。但是有没有另一种不使用StringLists的方法? - Fabio Gomes
THashedStringList 使用内部哈希列表以提高速度。 - Jeff Cuscutis
哇,我以前从未见过THashedStringList。好知道!谢谢,Jeff。 - Jozz
需要注意的一点是,THashedStringList 对于不经常更改的列表非常适用,但对于易变列表可能不是最佳选择。 - Jeff Cuscutis
是的,THashedStringList 在列表更改时会使哈希数组失效。 - Jozz

4

为你的"value"做一个包装器

TMyValue = class
  value: String;
end;

然后使用它:

myValue := TMyValue.Create;
myValue.Value = Value1;
MyStringList.AddObject(Key1, Value1);

然后,你可以对列表进行排序,使用IndexOf(Key1)方法检索对象。

这样,你的列表就被排序了,搜索速度非常快。


0

您可以使用一个多维常量数组和一个枚举类型来定义至少一个维度:

定义方法如下:

type
  TKVEnum = (tKey, tValue); // You could give this a better name
const
  Count = 3;
  KeyValues: array [1..Count, TKVEnum] of string =
    // This is each of your name / value paris
    (('1', 'a'), ('2', 'b'), ('3', 'd'));  

然后你可以像这样使用它:

if MyValue = KeyValues[1, TKVEnum.tKey] then 
  Result := KeyValues[1, TKVEnum.tValue]

你也可以使用一个For循环。这样和将它们作为单独的常量字符串一样高效,但它还给你带来了固有联系的额外优势。

我建议不要按数字定义第一个维度,而是

type
  TConstPairs = (tcUsername, tcDatabase, tcEtcetera);

但我猜这完全取决于您的常量代表什么。


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