Utilizzo di TDictionary per le tabelle hash in Delphi

Introdotto in Delphi 2009, il Classe TDictionary, definito nell'unità Generics.Collections, rappresenta una raccolta di tipi di tabella hash generica di coppie chiave-valore.

I tipi generici, introdotti anche in Delphi 2009, consentono di definire classi che non definiscono in modo specifico il tipo di membri dei dati.

Un dizionario è, in un certo senso, simile a un array. In un array si lavora con una serie (raccolta) di valori indicizzati da un valore intero, che può essere qualsiasi valore di tipo ordinale. Questo indice ha un limite inferiore e uno superiore.

In un dizionario, è possibile memorizzare chiavi e valori in cui entrambi possono essere di qualsiasi tipo.

Il costruttore TDictionary

Da qui la dichiarazione del costruttore TDictionary:

In Delphi, TDictionary è definito come una tabella hash. Le tabelle hash rappresentano una raccolta di coppie chiave-valore organizzate in base al codice hash della chiave. Le tabelle hash sono ottimizzate per le ricerche (velocità). Quando una coppia chiave-valore viene aggiunta a una tabella hash, l'hash della chiave viene calcolata e memorizzata insieme alla coppia aggiunta.

TKey e TValue, poiché sono generici, possono essere di qualsiasi tipo. Ad esempio, se le informazioni da memorizzare nel dizionario provengono da alcuni database, la chiave può essere un valore GUID (o qualche altro valore che presenta l'indice univoco) mentre il valore può essere un oggetto mappato su una riga di dati in le tabelle del database.

Utilizzando TDictionary

Per semplicità, l'esempio seguente utilizza numeri interi per TKeys e caratteri per TValues. 

In primo luogo, dichiariamo il nostro dizionario specificando quali saranno i tipi di TKey e TValue:

Quindi il dizionario viene riempito usando il metodo Aggiungi. Poiché un dizionario non può avere due coppie con lo stesso valore Chiave, è possibile utilizzare il metodo ContainsKey per verificare se una coppia con valori chiave è già all'interno del dizionario.

Per rimuovere una coppia dal dizionario, utilizzare il metodo Rimuovi. Questo metodo non causerà problemi se una coppia con una chiave specificata non fa parte del dizionario.

Per passare attraverso tutte le coppie eseguendo il ciclo attraverso i tasti è possibile eseguire un ciclo for in.

Utilizzare il metodo TryGetValue per verificare se nel dizionario è inclusa una coppia chiave-valore.

Ordinamento del dizionario

Poiché un dizionario è una tabella hash, non memorizza gli elementi in un ordinamento definito. Per scorrere le chiavi ordinate per soddisfare le tue esigenze specifiche, approfitta di TList, un tipo di raccolta generico che supporta l'ordinamento.

Il codice sopra ordina le chiavi in ​​ordine crescente e decrescente e prende i valori come se fossero memorizzati nell'ordine ordinato nel dizionario. L'ordinamento discendente dei valori di chiave di tipo intero utilizza TComparer e un metodo anonimo.