2008-10-29 4 views
6

Ich habe eine Menge von Konstanten, die irgendwie im Zusammenhang, irgendwann werden muß ich sie paaren, so etwas wie diese:Was ist der einfachste Weg, um mit assoziativen Strings (Schlüssel/Werten) zu arbeiten?

if MyValue = key1 then Result := value1; 

Ich weiß, wie man: tun vermeiden

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

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

Ich mag tun Sie es mit String-Listen mit:

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

Aber gibt es einen einfacheren Weg, dies zu tun?

+0

Delphi (seit 2009) hat jetzt eine TDictionary Klasse dafür. – awmross

Antwort

9

Ja, Zuordnung kann auf diese Weise statt durchgeführt werden, manuelle String-Verkettung zu vermeiden:

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

Die Verwendung von Werten/Namen einer StringList kann ein Geschwindigkeitsproblem sein. Wenn Sie diese Methode verwenden, sind alle Suchen linear, event, wenn Sie Ihre Liste sortieren. Wenn Sie dort eine kleine Datenmenge haben, ist es in Ordnung. Aber für große Menge, vermeiden Sie diese Technik – vIceBerg

+0

Danke, ich habe diesen Weg vergessen. Aber es gibt einen anderen Weg, ohne StringLists zu verwenden? –

+0

THashedStringList verwendet eine interne Hash-Liste für die Geschwindigkeit –

4

einen Wrapper Sie um Ihre "Wert"

 
TMyValue = class 
    value: String; 
end;

Dann verwenden:

 
myValue := TMyValue.Create; 
myValue.Value = Value1; 

MyStringList.AddObject(Key1, Value1); 

Dann können Sie Ihre Liste sortieren, ein IndexOf (Key1) tun und das Objekt abrufen.

So ist Ihre Liste sortiert und die Suche ist sehr schnell.

definieren es wie folgt aus: mindestens einer der Dimensionen für

0

Sie ein mehrdimensionales Konstante Array mit einer Aufzählung können

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

Dann können Sie es wie folgt verwenden:

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

Sie könnten eine Für Schleife auch verwenden. Dies ist genauso effizient wie die Ausführung als einzelne konstante Strings, bietet Ihnen aber den zusätzlichen Vorteil, dass sie intrinsisch verknüpft sind.

Statt numerisch die erste Dimension zu definieren, würde ich

type 
    TConstPairs = (tcUsername, tcDatabase, tcEtcetera); 

vorschlagen Aber ich denke, das hängt ganz auf das, was Sie Konstanten darstellen.