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

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

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, который использует компаратор равенства по умолчанию для типа набора, содержит элементы, скопированные из указанной коллекции, и имеет достаточную емкость для размещения количества скопированных элементов.

Другие вопросы по тегам