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 HashSetcontiene 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.) HashSetFornisce 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 HashSetclasse 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 HashSetin a Liste scorrere attraverso quello. Dai un'occhiata qui
A HashSetha 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 ( Containsoperatore).
Altri vantaggi del HashSetsono 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 HashSetha 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.