哈希集的浅拷贝

Posted

技术标签:

【中文标题】哈希集的浅拷贝【英文标题】:Shallow copy of a hashset 【发布时间】:2012-03-27 17:54:36 【问题描述】:

最好的方法是什么?

var set2 = new HashSet<reference_type>();

用这样的 foreach 遍历集合。

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

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

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

【问题讨论】:

【参考方案1】:

使用构造函数:

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

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

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

【讨论】:

只是一个更新:LINQ 现在有一个 ToHashSet 扩展方法。【参考方案2】:

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

set2 = new HashSet<type>(set);

甚至更好:

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

这可确保您使用与原始 HashSet 相同的相等比较器。例如,如果原来的 HashSet&lt;string&gt; 不区分大小写,那么新的也将不区分大小写。

【讨论】:

【参考方案3】:

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

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

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

来自MSDN docs:

HashSet<T>(IEnumerable<T> collection)

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

【讨论】:

以上是关于哈希集的浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章

数组的浅拷贝之后,置空,导致浅拷贝失效的问题总结

QImage的浅拷贝与深拷贝

js 对象的浅拷贝和深拷贝

python的浅拷贝和深拷贝

Perl的浅拷贝和深度拷贝

python for循环中的浅拷贝