Scegliere una collezione
Compromessi e prestazioni.
Scegliere una collezione è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 4 lezioni in totale.
Prima una domanda
La scelta di una raccolta inizia da una domanda: come accederà ai dati? Per posizione, tramite chiave o solo per verificare l'appartenenza?
List, Dictionary e HashSet rispondono ciascuno a un diverso schema di accesso. Abbini lo strumento allo schema e il codice resterà veloce e chiaro.
Accesso per posizione: List
Se l'ordine è importante e raggiunge gli elementi tramite indice, scelga List<T>. Mantiene l'ordine di inserimento e offre l'accesso tramite indice in O(1).
Esempi: una coda di passaggi, righe nell'ordine di visualizzazione o qualsiasi sequenza da scorrere dall'inizio alla fine. I duplicati sono consentiti.
var steps = new List<string> { "mix", "bake", "cool" };
string first = steps[0]; // O(1) by indexAccesso tramite chiave: Dictionary
Se cerca gli elementi tramite un identificatore univoco, scelga Dictionary<K,V>. Mappa una chiave a un valore con complessità media O(1).
Esempi: dall'ID utente all'utente, dal codice del Paese al nome, dalla parola al relativo conteggio. La chiave risponde alla domanda «quale?», mentre il valore contiene i dati.
var users = new Dictionary<int, string> {
[101] = "Ann",
[102] = "Bob"
};
string name = users[101];Appartenenza e unicità: HashSet
Se le interessa solo sapere se un valore è presente, oppure deve rifiutare i duplicati, scelga HashSet<T>. Contains ha complessità media O(1).
Esempi: URL visitati, autorizzazioni consentite, tag distinti. Non c'è un valore associato: conta solo la presenza dell'elemento.
var visited = new HashSet<string>();
if (visited.Add(url)) {
// first time seeing this url
}La tabella dei costi
Costi medi: l'accesso tramite indice di List è O(1), mentre Contains è O(n). Le ricerche in Dictionary e HashSet sono O(1).
List.Add alla fine ha costo ammortizzato O(1); inserire o rimuovere elementi nel mezzo costa O(n). L'aggiunta e la rimozione in Dictionary e HashSet hanno costo medio O(1).
// List: index O(1), Contains O(n)
// Dictionary: by-key O(1), no index
// HashSet: Contains O(1), no value, no indexList.Contains è un campanello d'allarme
Chiamare ripetutamente list.Contains all'interno di un ciclo è una trappola O(n al quadrato). Ogni controllo analizza l'intera lista.
Se i controlli di appartenenza sono predominanti, passi a un HashSet. Questa singola modifica può trasformare un ciclo lento in uno istantaneo su grandi quantità di dati.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var allow = new HashSet<int> { 2, 4, 6 };
foreach (int n in new[] { 1, 2, 3, 4 })
if (allow.Contains(n)) Console.Write(n + " ");
}
}Quando servono sia chiave sia ordine
Le serve una ricerca tramite chiave, ma anche un ordine prevedibile? Il Dictionary standard non garantisce l'ordine.
Valuti la possibilità di mantenere una List per l'ordine affiancata a un Dictionary per le ricerche, oppure utilizzi SortedDictionary<K,V> per mantenere le chiavi ordinate, al costo di O(log n).
var sorted = new SortedDictionary<string, int>();
sorted["b"] = 2;
sorted["a"] = 1;
// enumerates a then b, in key orderCompromessi in termini di memoria
Le raccolte basate su hash scambiano memoria per velocità. Dictionary e HashSet mantengono bucket interni e utilizzano più memoria di una List compatta o di un array.
Per raccolte piccole con pochi elementi, una scansione di una List può essere perfettamente adeguata e consumare meno memoria. L'hashing diventa vantaggioso su larga scala.
Programmare rispetto alle interfacce
Le firme dei metodi dovrebbero richiedere il tipo meno specifico che sia sufficiente. Accetti IEnumerable<T> per la lettura, IReadOnlyList<T> per la lettura tramite indice e IDictionary<K,V> per l'accesso tramite chiave.
In questo modo disaccoppia i chiamanti dalla scelta concreta e può sostituire l'implementazione in seguito senza modificare le firme.
int Sum(IEnumerable<int> values) {
int total = 0;
foreach (int v in values) total += v;
return total;
}Un esempio completo
Per contare le parole univoche in un testo si usano insieme due raccolte. Un HashSet tiene traccia delle parole già viste, mentre un Dictionary ne conta le occorrenze.
Ciascuna svolge bene il proprio compito: il set garantisce l'unicità, il dizionario associa ogni parola alla relativa frequenza, entrambi con un costo medio O(1) per operazione.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var counts = new Dictionary<string, int>();
foreach (var w in "a b a c b a".Split(' '))
counts[w] = counts.GetValueOrDefault(w) + 1;
Console.WriteLine(counts["a"]); // 3
}
}Lista di controllo per la scelta
Si ponga queste domande, in ordine: le serve una mappa da chiave a valore? Utilizzi Dictionary. Le servono solo unicità o appartenenza? Utilizzi HashSet.
Altrimenti, le servono ordine e accesso tramite indice, eventualmente con duplicati? Utilizzi List. Questa breve lista copre la maggior parte dei casi quotidiani.
Verifica rapida
Applichi la lista di controllo a un'esigenza concreta.
Riepilogo
Scelga in base allo schema di accesso: List per sequenze ordinate e indicizzate; Dictionary per le ricerche da chiave a valore; HashSet per unicità e appartenenza.
Presti attenzione alla notazione Big-O: eviti List.Contains nei cicli critici, sfrutti le ricerche hash O(1) e programmi rispetto alle interfacce, così la scelta resterà flessibile.
Domande Frequenti
La lezione «Scegliere una collezione» è gratuita?
Sì — il testo completo di «Scegliere una collezione» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 4 lezioni in totale.
Cosa imparerò in «Scegliere una collezione»?
Compromessi e prestazioni. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C# Academy?
Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Scegliere una collezione»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C# Academy?
Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Le liste nella pratica
- Ricerche nei dizionari
- HashSet e unicità
- Scegliere una collezione