Alcuni giorni fa, ho risposto a an interesting question su SO su HashSet<T>
. Una possibile soluzione coinvolto clonazione del HashSet, e nella mia risposta che ho suggerito di fare qualcosa di simile:Un modo efficiente per clonare un HashSet <T>?
HashSet<int> original = ...
HashSet<int> clone = new HashSet<int>(original);
Anche se questo approccio è abbastanza semplice, ho il sospetto che sia molto inefficiente: il costruttore delle nuove HashSet<T>
bisogno di aggiungere a parte ogni articolo dall'hashset originale e verifica se non è già presente. Questa è chiaramente una perdita di tempo: poiché la raccolta di origine è una ISet<T>
, è garantito che non contenga duplicati. Ci dovrebbe essere un modo per sfruttare questa conoscenza ...
Idealmente, HashSet<T>
dovrebbe implementare ICloneable
, ma sfortunatamente non è il caso. Ho anche controllato con Reflector per vedere se il costruttore HashSet<T>
ha fatto qualcosa di specifico se la collezione di origine era un hashset, ma non è così. Potrebbe probabilmente essere fatto usando la riflessione su campi privati, ma sarebbe un brutto attacco ...
Quindi, qualcuno ha escogitato una soluzione intelligente per clonare un hashset in modo più efficiente?
(Si noti che questa domanda è puramente teorica, non ho bisogno di farlo in un programma vero e proprio)
hm, buona domanda, solo curioso però, quali sono le inefficienze teoriche di cui ci preoccupiamo? Sono arrugginito sulla notazione degli ordini per i tipi di dati astratti, ma un controllo dell'esistenza all'interno dell'hash target non dovrebbe essere un semplice test di collisione O (1)? Sono d'accordo dal punto di vista informativo che potrebbe essere "migliore" ma possiamo metterci un limite e sarebbe significativo? –
Sospetto che non abbiano un costruttore HashSet (ISet ) perché qualsiasi classe potrebbe implementare ISet , forse male; il che significa che la presenza di ISet non garantisce che non vi siano duplicati –
@Steve Ellinger, probabilmente hai ragione. Tuttavia, avrebbero potuto fornire un costruttore HashSet (HashSet ) ... –