30

最好的方法是什么?

var set2 = new HashSet<reference_type>();

像这样使用 foreach 遍历集合。

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

或者使用类似这样的联合。

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

3 回答 3

46

使用构造函数:

HashSet<type> set2 = new HashSet<type>(set1);

就我个人而言,我希望 LINQ to Objects 有一个ToHashSet扩展方法,就像它对ListDictionary. 当然,创建自己的课程很容易:

public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source)
{
    if (source == null)
    {
        throw new ArgumentNullException("source");
    }
    return new HashSet<T>(source);
}

(自定义相等比较器的另一个重载。)

这使得创建匿名类型的集合变得容易。

于 2012-03-10T17:04:48.747 回答
18

最好是主观的,但我会这样做:

set2 = new HashSet<type>(set);

甚至更好:

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

这可确保您使用与原始 HashSet 相同的相等比较器。例如,如果原始文件不区分大小写HashSet<string>,那么您的新文件也将不区分大小写。

于 2012-03-10T17:05:11.907 回答
6

这可能是最简单和最好的:

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

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

MSDN 文档

HashSet<T>(IEnumerable<T> collection)

初始化 HashSet 类的新实例,该实例使用集合类型的默认相等比较器,包含从指定集合复制的元素,并且有足够的容量容纳复制的元素数量。

于 2012-03-10T17:04:50.450 回答