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.