Лично мне хотелось бы, чтобы 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);
}
(С другой перегрузкой для пользовательского сопоставления равенства.)
Это упрощает создание наборов анонимного типа.
Ответ 2
Лучше субъективно, но я бы сделал это следующим образом:
set2 = new HashSet<type>(set);
Или даже лучше:
set2 = new HashSet<type>(set, set.Comparer);
который гарантирует, что вы используете тот же сопоставитель сравнений, что и исходный HashSet. Например, если оригинал был нечувствительным к регистру HashSet<string>, ваш новый будет также нечувствительным к регистру.
Ответ 3
Это, наверное, самый простой и лучший:
HashSet<int> s = new HashSet<int>{1,2,3};
HashSet<int> t = new HashSet<int>(s);
Инициализирует новый экземпляр класса HashSet, который использует компаратор равенства по умолчанию для типа набора, содержит элементы, скопированные из указанной коллекции, и имеет достаточную емкость для размещения количества скопированных элементов.