2008-10-29 23 views
6

tôi có rất nhiều các hằng số có liên quan bằng cách nào đó, tại một số điểm tôi cần ghép chúng, một cái gì đó như thế này:Cách đơn giản nhất để làm việc với các chuỗi liên kết (khóa/giá trị) là gì?

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

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

Tôi muốn tránh thực hiện:

if MyValue = key1 then Result := value1; 

Tôi biết làm thế nào để làm điều đó với danh sách chuỗi sử dụng:

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

Nhưng, có cách nào đơn giản hơn để thực hiện việc này không?

+0

Delphi (kể từ năm 2009) hiện có lớp TDictionary để thực hiện việc này. – awmross

Trả lời

9

Có, chuyển nhượng có thể được thực hiện theo cách này thay vào đó, tránh tay nối chuỗi:

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

Sử dụng giá trị/tên của một StringList có thể là một vấn đề tốc độ. Khi sử dụng phương pháp đó, tất cả các tìm kiếm là tuyến tính, sự kiện nếu bạn sắp xếp danh sách của mình. Nếu bạn có một lượng nhỏ dữ liệu ở đó, nó là ok. Nhưng với số lượng lớn, tránh kỹ thuật đó – vIceBerg

+0

Cảm ơn, tôi đã quên theo cách này. Nhưng có một cách khác mà không cần sử dụng StringLists? –

+0

THashedStringList sử dụng danh sách băm bên trong cho tốc độ –

4

Làm một wrapper xung quanh "giá trị" của bạn

 
TMyValue = class 
    value: String; 
end;

Sau đó sử dụng này:

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

MyStringList.AddObject(Key1, Value1); 

Sau đó, bạn có thể sắp xếp danh sách của mình, thực hiện một IndexOf (Key1) và truy xuất đối tượng.

Bằng cách đó, danh sách của bạn được sắp xếp và tìm kiếm rất nhanh.

0

Bạn có thể sử dụng một mảng liên tục đa chiều với một điều tra cho ít nhất một trong các kích thước:

Xác định nó như thế này:

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

Sau đó, bạn sử dụng nó như thế này:

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

Bạn cũng có thể sử dụng Đối với vòng lặp trên đó. Điều này cũng hiệu quả như việc thực hiện chúng như các chuỗi liên tục riêng lẻ, nhưng mang lại cho bạn lợi thế bổ sung mà chúng có liên quan đến bản chất.

Thay vì xác định kích thước đầu tiên số lượng, tôi sẽ đề nghị

type 
    TConstPairs = (tcUsername, tcDatabase, tcEtcetera); 

Nhưng tôi đoán rằng hoàn toàn phụ thuộc vào những gì bạn hằng đại diện.

Các vấn đề liên quan