2012-03-10 5 views
13

¿Cuál es la mejor manera de hacerlo?copia superficial de un hashset

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

Atraviesa el conjunto con un foreach como este?

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

O use algo así como unison como este?

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

Respuesta

20

utilizar el constructor:

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

Personalmente me gustaría LINQ a Objetos tenía un método ToHashSet extensión como lo hace para List y Dictionary. Es fácil de crear su propia supuesto:

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

(Con otro sobrecarga para un comparador de igualdad personalizado.)

Esto hace que sea fácil crear conjuntos de un tipo anónimo.

4

Este es probablemente el más fácil y mejor:

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

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

Desde el MSDN docs:

HashSet<T>(IEnumerable<T> collection) 

Inicializa una nueva instancia de la clase HashSet que utiliza el comparador de igualdad predeterminada para el juego tipo, contiene elementos copiados de la colección especificada, y tiene suficiente capacidad para acomodar el número de elementos copiados

10

Lo mejor es subjetivo, pero lo haría de la siguiente manera:

set2 = new HashSet<type>(set); 

O aún mejor:

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

que asegura que está utilizando el mismo comparador de igualdad que el original HashSet. Por ejemplo, si el original no distingue entre mayúsculas y minúsculas HashSet<string>, el nuevo tampoco será sensible a las mayúsculas y minúsculas.

Cuestiones relacionadas