Quale collection utilizzare? Parliamone...

di Stefano Mostarda, in .NET,

Dopo aver dato parlato, nella mia ultima bloggata, della ricerca in una collection, mi sono andato a rileggere il capitolo di un vecchio libro che parlava di questo argomento.
Il Framework ci mette a disposizione diversi tipi di collection, ognuna delle quali ha delle caratteristiche che la rendono ideale per determinati scenari e una pessima scelta per altri. Le collection più utilizzate sono 4: ArrayList, HashTable, Queue e Stack. Queste coprono il 100% delle nostre esigenze ma, molte volte vengono usate anche quando ci sono delle migliori alternative, in termini di performance e/o risorse e/o semplicità del codice.
Alzi la mano chi non ha mai usato un ArrayList per immagazzinare solo stringhe, chi non ha usato una HashTable per ricercare velocemente meno di 10 elementi o non ha usato una HashTable con una chiave di tipo String. Questi sono tutti casi in cui la scelta non è stata ottimale.
Iniziamo dalla classe StringCollection. Questa è una collection tipizzata creata appositamente per contenere stringhe. Questo ci risparmia il cast per ogni volta che estraiamo un elemento. (Semplicità del codice + maggior tipizzazione = Minore possibilità di errori).
Stesso discorso per la classe StringDictionary. Questa altro non è che una HashTable tipizzata per contenere una chiave di tipo string e un valore object. Ovviamente il top sarebbe tipizzare ulteriormente la classe permettendo di inserire solo un determinato oggetto come valore, ma questa non è sempre la nostra esigenza. (Anche qui semplicità del codice + maggior tipizzazione = Minore possibilità di errori).
Un'altra collection che merita di essere nominata è la ListDictionary. Questa è un lista di coppie Chiave-Valore(Dictionary) ottimizzata in memoria per contenere un massimo di 10 elementi, oltre questo numero c'è un degrado di prestazioni. In questo caso non c'è ne tipizzazione ne migliori prestazioni, ma solo ottimizzazione delle risorse, quindi ideale in ambito Web.
Se la ListDictionary supera i 10 elementi, conviene passare ad una HashTable visto che questa è ottimizzata per carichi maggiori. Esiste una classe che fa questo lavoro per noi: HybridDictionary. Questa va usata con parsimonia, perchè se da un lato ottimizza l'uso della collection sottostante, dall'altro introduce un carico al momento dello switch. Il consiglio è di usarla solo quando si sa che lo switch tra i tipi sottostanti è molto raro. Ottima anche questa nell'ambito Web.
Quando si ha bisogno di caricare dei dati solo all'inizio e di ricercarli in maniera rapida, la classe SortedList è l'ottimale. Questa rappresenta un lista di coppie Chiave-Valore ordinate in memoria al momento dell'inserimento. La particolarità di questa collection è che gli elementi possono essere acceduti sia per chiave che per indice. Per fare questo, la classe tiene in memoria un ArrayList per l'accesso per indice e un HashTable per quello per chiave; questo comporta un conseguente utilizzo elevato di risorse, che rende la classe ottimale più per applicativi Stand-Alone che Web based.
Infine c'è la classe NameValueCollection. Questa contiene una lista di coppie Chiavi-Valore, ordinate, tipizzate per contenere solo stringhe. Ciò che rende diversa questa collection dalle altre di tipo Chiave-Valore è il fatto che può contenere chiavi duplicate. Molto utilizzata nel framework soprattutto in ambito Web (basta pensare alle proprietà QueryString, Form e Param della classe HttpRequest).

Davanti a tanta carne al fuoco, la scelta della collection da utilizzare si deve basare in base a diversi parametri quali necessita di sort e/o ricerca dei dati, ambiente di utilizzo, quantità di dati, ecc ecc.
Alcuni esempi sono:
Se si deve poter accedere sia per indice che per chiave allora si useranno NameValueCollection e SortedList.
Se i dati cambiano frequentemente, l'ArrayList e la HashTable sono ottimali.
Se i dati cambiano raramente l'ottimo è rappresentato da SortedList.
Se il numero di elementi da memorizzare è prevalentemente basso, la HybridDictionary è ottimale.

Stay Tuned...

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese