2008-10-29 78 views
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]; 

但是,有沒有更簡單的方法來做到這一點?

+0

德爾福(自2009年以來)現在有一個TDictionary類來做到這一點。 – awmross 2011-08-29 04:19:42

回答

9

是的,轉讓是可以做到這樣,而不是,避免了手工字符串連接:

MyStringList.Values[Key1] := Value1; 
+0

使用StringList的值/名稱可能是一個速度問題。使用該方法時,如果對列表進行排序,則所有搜索都是線性的,事件。如果你有少量的數據,那沒問題。但是,對於大量,避免這種技術 – vIceBerg 2008-10-29 18:45:01

4

周圍做你的 「價值」 的包裝

 
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] 

您可以使用對於循環也可以。這和單獨的常量字符串一樣有效,但它給你增加了內在聯繫的優點。

相反數值限定了第一維度的,我會建議

type 
    TConstPairs = (tcUsername, tcDatabase, tcEtcetera); 

但我想這完全取決於你常量表示。

相關問題