valor net iset generic framework examples diccionario clave asp c# collections union traversal shallow-copy

c# - net - Copia superficial de un hashset



iset c# (3)

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);

De los documentos de MSDN :

HashSet<T>(IEnumerable<T> collection)

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

¿Cuál es la mejor manera de hacerlo?

var set2 = new HashSet<reference_type>();

Atraviesa el set con un foreach como este.

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

O usa algo como la unión como esta.

set2 = set.UnionWith(set); // all the elements


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

set2 = new HashSet<type>(set);

O mejor:

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

lo que garantiza que esté utilizando el mismo comparador de igualdad que el HashSet original. Por ejemplo, si el original era un HashSet<string> distingue HashSet<string> mayúsculas y minúsculas, su nuevo también lo hará.


Usa el constructor:

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

Personalmente deseo que LINQ to Objects tuviera un método de extensión ToHashSet como lo hace para List y Dictionary . Por supuesto, es fácil crear el tuyo:

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

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

Esto facilita la creación de conjuntos de un tipo anónimo.