【问题标题】:What is the simplest way to work with associative strings (key/values)?使用关联字符串(键/值)的最简单方法是什么?
【发布时间】:2008-10-29 18:35:36
【问题描述】:

我有很多以某种方式相关的常量,有时我需要将它们配对,如下所示:

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 类来执行此操作。

标签: delphi


【解决方案1】:

是的,可以通过这种方式进行赋值,避免手动字符串连接:

MyStringList.Values[Key1] := Value1;

【讨论】:

  • 使用 StringList 的值/名称可能是一个速度问题。使用该方法时,所有搜索都是线性的,如果您对列表进行排序。如果那里有少量数据,没关系。但是对于大量,请避免使用该技术
  • 谢谢,我已经忘记了。但是还有另一种不使用StringLists的方法吗?
  • THashedStringList 使用内部散列列表来提高速度
  • 哇,我以前从未见过 THashedStringList。很高兴知道!谢谢,杰夫。
  • 需要注意的一点是 THashedStringList 非常适合变化不大的列表,但对于易失性列表可能不是最好的。
【解决方案2】:

围绕你的“价值”做一个包装

TMyValue = 类 值:字符串; 结束;

然后使用这个:

myValue := TMyValue.Create; 我的价值。价值=价值1; MyStringList.AddObject(Key1, Value1);

然后,您可以对列表进行排序,执行 IndexOf(Key1) 并检索对象。

这样,您的列表就会被排序并且搜索速度非常快。

【讨论】:

    【解决方案3】:

    您可以使用一个多维常量数组,其中至少包含一个维度的枚举:

    这样定义:

    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);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-01
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      • 2018-10-31
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多