HashSet La struttura di dati HashSet C # è stata introdotta in .NET Framework 3.5. Un elenco completo dei membri implementati è disponibile nella pagina MSDN di HashSet .
- Dove è usato?
- Perché dovresti usarlo?
HashSet La struttura di dati HashSet C # è stata introdotta in .NET Framework 3.5. Un elenco completo dei membri implementati è disponibile nella pagina MSDN di HashSet .
Risposte:
A HashSet
contiene un set di oggetti, ma consente di determinare facilmente e rapidamente se un oggetto è già nel set o meno. Lo fa gestendo internamente un array e memorizzando l'oggetto usando un indice che viene calcolato dall'hashcode dell'oggetto. Dai un'occhiata qui
HashSet
è una raccolta non ordinata contenente elementi unici. Ha le operazioni di raccolta standard Aggiungi, Rimuovi, Contiene, ma poiché utilizza un'implementazione basata su hash, queste operazioni sono O (1). (A differenza di List, ad esempio, che è O (n) per Contiene e Rimuovi.) HashSet
Fornisce anche operazioni di serie standard come unione , intersezione e differenza simmetrica . Dai un'occhiata qui
Esistono diverse implementazioni di set. Alcuni rendono le operazioni di inserimento e ricerca super veloci grazie agli elementi di hashing. Tuttavia, ciò significa che si perde l'ordine in cui sono stati aggiunti gli elementi. Altre implementazioni preservano l'ordine aggiunto a costo di tempi di esecuzione più lenti.
La HashSet
classe in C # va per il primo approccio, quindi non preservando l'ordine degli elementi. È molto più veloce di un normale List
. Alcuni benchmark di base hanno mostrato che HashSet è decisamente più veloce quando si tratta di tipi primari (int, double, bool, ecc.). È molto più veloce quando si lavora con oggetti di classe. Quindi quel punto è che HashSet è veloce.
L'unica cattura di HashSet
è che non vi è accesso da parte degli indici. Per accedere agli elementi è possibile utilizzare un enumeratore o utilizzare la funzione incorporata per convertire HashSet
in a List
e scorrere attraverso quello. Dai un'occhiata qui
A HashSet
ha una struttura interna (hash), in cui gli oggetti possono essere cercati e identificati rapidamente. Il rovescio della medaglia è che iterare attraverso un HashSet
(o ottenere un oggetto per indice) è piuttosto lento.
Quindi perché qualcuno dovrebbe voler sapere se esiste già una voce in un set?
Una situazione in cui a HashSet
è utile è ottenere valori distinti da un elenco in cui possono esistere duplicati. Una volta aggiunto un articolo HashSet
, è rapido determinare se esiste ( Contains
operatore).
Altri vantaggi del HashSet
sono le operazioni Set: IntersectWith
, IsSubsetOf
, IsSupersetOf
, Overlaps
, SymmetricExceptWith
, UnionWith
.
Se hai familiarità con il linguaggio del vincolo oggetto , identificherai queste operazioni impostate. Vedrai anche che è un passo avanti verso l'implementazione di UML eseguibile.
Detto semplicemente e senza rivelare i segreti della cucina:
un set in generale, è una collezione che non contiene elementi duplicati e i cui elementi non sono in un ordine particolare. Quindi, A HashSet<T>
è simile a un generico List<T>
, ma è ottimizzato per ricerche veloci (tramite hashtable, come suggerisce il nome) a costo di perdere l'ordine.
Dal punto di vista dell'applicazione, se uno deve solo evitare i duplicati, allora HashSet
è quello che stai cercando poiché è la complessità di ricerca, inserimento e rimozione sono O (1) . Ciò significa che non importa quanti elementi HashSet
ha lo stesso tempo ci vorrà per controllare se c'è un tale elemento o meno, inoltre poiché stai inserendo elementi anche su O (1) lo rende perfetto per questo genere di cose.