Подтвердить что ты не робот

Мелкая копия хешета

Какой лучший способ сделать это?

var set2 = new HashSet<reference_type>();

Пройдите через сет с таким foreach.

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

Или используйте что-то вроде союза.

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

Ответ 1

Используйте конструктор:

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

(С другой перегрузкой для пользовательского сопоставления равенства.)

Это упрощает создание наборов анонимного типа.

Ответ 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);

Из документов MSDN:

HashSet<T>(IEnumerable<T> collection)

Инициализирует новый экземпляр класса HashSet, который использует компаратор равенства по умолчанию для типа набора, содержит элементы, скопированные из указанной коллекции, и имеет достаточную емкость для размещения количества скопированных элементов.