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

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

21 голосов
/ 10 марта 2012

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

var set2 = new HashSet<reference_type>();

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

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

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

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

Ответы [ 3 ]

30 голосов
/ 10 марта 2012

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

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

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

Это позволяет легко создавать наборы анонимного типа.

14 голосов
/ 10 марта 2012

Лучше всего субъективно, но я бы сделал это следующим образом:

set2 = new HashSet<type>(set);

Или даже лучше:

set2 = new HashSet<type>(set, set.Comparer);

, что гарантирует использование того же компаратора равенства, что иоригинальный HashSet.Например, если в оригинале не учитывается регистр HashSet<string>, ваш новый также не учитывает регистр.

5 голосов
/ 10 марта 2012

Это, наверное, самый простой и лучший:

HashSet<int> s = new HashSet<int>{1,2,3};

HashSet<int> t = new HashSet<int>(s);

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

HashSet<T>(IEnumerable<T> collection)

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

...