2012-03-10 9 views
13

Co to jest najlepszy sposób robienia tego.Płytka kopia hashsetu

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

Przejrzyj zestaw za pomocą foreach w ten sposób?

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

Lub użyć czegoś takiego jak unisono w ten sposób?

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

Odpowiedz

20

użyć konstruktora:

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

Osobiście życzę LINQ to Objects miał metodę ToHashSet przedłużacza jak dla List i Dictionary. Łatwo jest stworzyć własny przedmiotu:

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

(Z drugiej przeciążenia dla comparer zwyczaj równości.)

To sprawia, że ​​łatwo tworzyć zestawy typu anonimowego.

4

Jest to chyba najprostszy i najlepszy:

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

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

Z MSDN docs:

HashSet<T>(IEnumerable<T> collection) 

Inicjuje nowe wystąpienie klasy Hashset który używa domyślny porównywarka równości dla zestawu typ, zawiera elementy skopiowane z określonej kolekcji i ma wystarczającą pojemność do uwzględniającą liczbę elementy skopiowane.

10

Najlepszy jest subiektywna, ale zrobiłbym to następująco:

set2 = new HashSet<type>(set); 

albo jeszcze lepiej:

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

który gwarantuje, że używasz tego samego porównywarka równości jak oryginał HashSet. Na przykład, jeśli oryginał był niewrażliwy na wielkość liter HashSet<string>, twój nowy będzie również nie uwzględniał wielkości liter.