Мелкая копия хешсета
Какой лучший способ сделать это.
HashSet<reference_type> set2 = new HashSet<reference_type>();
Пройдете через сет с таким foreach?
foreach (var n in set)
set2.Add(n);
Или использовать что-то вроде унисон, как это?
chunk2 = chunk.UnionWith(chunk); // all the elements
3 ответа
Используйте конструктор:
HashSet<type> set2 = new HashSet<type>(set1);
Лично я хотел бы, чтобы LINQ to Objects имел ToHashSet
метод расширения, как это делается для List
а также Dictionary
, Конечно, создать свой собственный легко:
public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
return new HashSet<T>(source);
}
(С другой перегрузкой для пользовательского компаратора равенства.)
Это позволяет легко создавать наборы анонимного типа.
Лучшее субъективно, но я бы сделал это следующим образом:
set2 = new HashSet<type>(set);
Или даже лучше:
set2 = new HashSet<type>(set, set.Comparer);
который гарантирует, что вы используете тот же компаратор равенства, что и оригинальный HashSet. Например, если оригинал нечувствителен к регистру HashSet<string>
Ваш новый также будет без учета регистра.
Это, наверное, самый простой и лучший:
HashSet<int> s = new HashSet<int>{1,2,3};
HashSet<int> t = new HashSet<int>(s);
Из документов MSDN:
HashSet<T>(IEnumerable<T> collection)
Инициализирует новый экземпляр класса HashSet, который использует компаратор равенства по умолчанию для типа набора, содержит элементы, скопированные из указанной коллекции, и имеет достаточную емкость для размещения количества скопированных элементов.