哈希集合的浅复制

33

最佳实现方式是什么?

var set2 = new HashSet<reference_type>();

使用 foreach 循环遍历集合,代码如下。

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

或者像这样使用联合。

set2 = set.UnionWith(set); // all the elements
3个回答

54

使用构造函数:

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

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

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

(使用自定义相等比较器的其他重载函数。)

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


3
更新一下:LINQ现在有一个ToHashSet扩展方法。 - Benji Altman

19

最好的方式是主观的,但我会按照以下方式进行:

set2 = new HashSet<type>(set);

或者更好的做法:

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

这可以确保您使用与原始HashSet相同的相等比较器。例如,如果原始集合是不区分大小写的 HashSet<string>,则您的新集合也将是不区分大小写的。


6

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

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

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

来自MSDN文档:

HashSet<T>(IEnumerable<T> collection)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接