2012-03-10 16 views
13

Qual è il modo migliore per farlo.Copia superficiale di un hashset

HashSet<reference_type> set2 = new HashSet<reference_type>(); 

Attraversare il set con un foreach come questo?

foreach (var n in set) 
    set2.Add(n); 

Oppure usare qualcosa come unisono come questo?

chunk2 = chunk.UnionWith(chunk); // all the elements 

risposta

20

utilizzare il costruttore:

HashSet<type> set2 = new HashSet<type>(set1); 

Personalmente vorrei LINQ to Objects ha avuto un metodo ToHashSet estensione come fa per List e Dictionary. E 'facile creare il proprio ovviamente:

public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source) 
{ 
    if (source == null) 
    { 
     throw new ArgumentNullException("source"); 
    } 
    return new HashSet<T>(source); 
} 

(Con un altro sovraccarico per un confronto di uguaglianza personalizzato.)

Ciò rende più semplice la creazione di gruppi di un tipo anonimo.

4

Questo è probabilmente il più semplice e migliore:

HashSet<int> s = new HashSet<int>{1,2,3}; 

HashSet<int> t = new HashSet<int>(s); 

Dal MSDN docs:

HashSet<T>(IEnumerable<T> collection) 

Inizializza una nuova istanza della classe HashSet che utilizza il confronto di uguaglianza di default per il set digitare, contiene elementi copiati dalla raccolta specificata e ha una capacità sufficiente per ospitare il numero di elementi copiati.

10

migliore è soggettivo, ma mi piacerebbe farlo nel modo seguente:

set2 = new HashSet<type>(set); 

O ancora meglio:

set2 = new HashSet<type>(set, set.Comparer); 

che assicura che si sta utilizzando lo stesso confronto di uguaglianza come l'originale HashSet. Ad esempio, se l'originale era senza distinzione tra maiuscole e minuscole, HashSet<string>, anche il nuovo sarà senza distinzione tra maiuscole e minuscole.

Problemi correlati