2012-12-07 20 views
6

Se si lavora con php, è possibile vedere che il php ha un array associativo (o una stringa di stringa della larghezza dell'array) nella programmazione di lang. Per esempio:Array associativo in Delphi, array con chiave stringa è possibile?

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

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

Ma non riesce a trovare alcun modo predefinito da usare array associativo in Delphi.

Prima voglio trovare il modo predefinito senza alcun componente o classe di uscita. Secondo se davvero non riesco a trovare con il modo interno, costringo a scegliere solo le classi di output.

Io uso Delphi XE3, molte grazie per il vostro aiuto.

modifica: Ho trovato una classe qui: http://www.delphipages.com/forum/showthread.php?t=26334 uguale a php, ma in qualche modo migliore?

+2

Un'implementazione molto bella di Associative Array in Delphi può essere trovata qui: http://stackoverflow.com/a/15854846/1022219. Corrispondenza più vicina a Assoc Array di PHP –

+0

@iPath: concorda con:) –

risposta

8

È possibile utilizzare tStrings e tStringList per questo scopo, ma gli array 2d non rientrano nell'ambito di questi componenti.

Utilizzo;

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

dovrebbe essere: = (l'operatore di assegnazione) not = che confronta due valori/oggetti –

15

È possibile utilizzare TDictionary<string,string> dall'unità 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; 

E così via e così via.

Se si desidera un dizionario che contiene un dizionario, è possibile utilizzare TDictionary<string, TDictionary<string,string>>.

Tuttavia, quando si esegue questa operazione è necessario prestare particolare attenzione alla durata degli elementi del dizionario contenuti nel dizionario esterno. Puoi usare TObjectDictionary<K,V> per aiutarti a gestirlo per te. Faresti creare uno di questi oggetti come questo:

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

Questa TObjectDictionary<k,V> funziona lo stesso era come una tradizionale TObjectList con OwnsObjects set per True.

+0

qui non è il modo completo in cui ho trovato di meglio qui: http://www.delphipages.com/forum/showthread.php?t=26334, ma Voglio una lezione completa, ma grazie David :) –

+2

Non capisco quel commento. Quello che stai cercando sono le classi descritte nella mia risposta. –

+1

tDictionary è stato introdotto nelle nuove versioni di Delphi. Questa soluzione è molto meglio di quella che ho dato con tStrings.Perché l'implementazione di tDictionary è migliore di tStrings. –

0

aver risolto il problema che modo semplice (esempio):

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. 

// 

Poi nel programma che utilizza due array const_TypesChar e const_TypesStr in un array associativo con AnsiIndexStr funzione .

Il vantaggio è che è semplice e che non è necessario modificare il codice in punti diversi del programma ogni volta che aggiungiamo elementi ai nostri array.

Problemi correlati