2012-12-07 11 views
6

Jeśli pracujesz z php, możesz zobaczyć, że php ma tablicę asocjacyjną (lub klucz łańcucha) w języku programowania. Na przykład:Powiązana tablica w Delphi, tablica z kluczem łańcuchowym jest możliwa?

$server['hostname'] = 'localhost'; 
$server['database'] = 'test'; 
$server['username'] = 'root'; 
$server['password'] = 'password' ;  

// 2d array 
$all['myserver']['hostname'] = 'localhost' ; 

Ale nie mogę znaleźć żadnego domyślnego sposobu korzystania asocjacyjną w Delphi.

Najpierw chcę znaleźć domyślny sposób bez żadnego komponentu wyjściowego lub klasy. Po drugie, jeśli naprawdę nie mogę znaleźć w sposób wewnętrzny, wymuszam wybór tylko klas wyjściowych.

Używam Delphi XE3, wielkie dzięki za pomoc.

edytuj: Znalazłem jedną klasę tutaj: http://www.delphipages.com/forum/showthread.php?t=26334 samo jak php, ale w jakikolwiek lepszy sposób?

+2

Bardzo dobra implementacja Asocjacyjnej macierzy w Delphi można znaleźć tutaj: http://stackoverflow.com/a/15854846/1022219. Jest najbliżej PHP Assoc Array –

+0

@iPath: Zgadzam się z podziękowaniem:) –

Odpowiedz

8

Do tego celu można użyć tStrings i tStringList, ale tablice 2d są poza zakresem tych komponentów.

Użycie;

var 
    names : TStrings; 
begin 
    ... 
    names := TStringList.Create; 
    ... 
    ... 
    names.values['ABC'] = 'VALUE of ABC' ; 
    ... 
    ... 
end ; 
+1

powinno być: = (operator przypisania) nie = który porównuje dwie wartości/obiekty –

15

Możesz użyć TDictionary<string,string> z jednostki Generics.Collections.

var 
    Dict: TDictionary<string,string>; 
    myValue: string; 
.... 
Dict := TDictionary<string,string>.Create; 
try 
    Dict.Add('hostname', 'localhost'); 
    Dict.Add('database', 'test'); 
    //etc. 
    myValue := Dict['hostname']; 
finally 
    Dict.Free; 
end; 

I tak dalej i tak dalej.

Jeśli chcesz słownik zawierający słownik, możesz użyć opcji TDictionary<string, TDictionary<string,string>>.

Jednak, gdy to zrobisz, będziesz musiał zachować szczególną ostrożność przez cały okres ważności artykułów słownika zawartych w słowniku zewnętrznym. Możesz użyć TObjectDictionary<K,V>, aby pomóc sobie z tym. Można by stworzyć jeden z tych obiektów, takich jak ten:

TObjectDictionary<string, TDictionary<string,string>>.Create([doOwnsValues]); 

Ten TObjectDictionary<k,V> działa tak samo było jak tradycyjny TObjectList z OwnsObjects zestaw do True.

+0

tutaj nie jest kompletny sposób znalazłem lepiej tutaj: http://www.delphipages.com/forum/showthread.php?t=26334, ale Chcę mieć pełną klasę, ale dziękuję David :) –

+2

Nie rozumiem tego komentarza. To, czego szukasz, to klasy opisane w mojej odpowiedzi. –

+1

tDictionary został wprowadzony w nowszych wersjach Delphi. To rozwiązanie jest o wiele lepsze niż to, które dałem z tStrings.Ponieważ implementacja tDictionary jest lepsza niż tStrings. –

0

że rozwiązali problem, że w prosty sposób (na przykład):

uses StrUtils; 

... 

const const_TypesChar : array [0..4] of String = 
    (
     'I', 
     'F', 
     'D', 
     'S', 
     'B' 
    ); 
const const_TypesStr : array [0..4] of String = 
    (
     'Integer', 
     'Float', 
     'Datetime', 
     'String', 
     'Boolean' 
    ); 

... 

Value := const_TypesStr[ AnsiIndexStr('S', const_TypesChar) ]; 

// As an example, after execution of this code Value variable will have 'String' value. 

// 

Następnie w programie używamy dwóch tablic const_TypesChar i const_TypesStr jako jeden asocjacyjnej z AnsiIndexStr funkcji .

Plus jest to, że jest to proste i że nie musimy zmieniać kodu w różnych miejscach programu za każdym razem, gdy dodamy elementy do naszych tablic.