哈希集的浅拷贝
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
扩展方法,就像 List
和 Dictionary
一样。当然很容易创建自己的:
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<string>
不区分大小写,那么新的也将不区分大小写。
【讨论】:
【参考方案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 类型的默认相等比较器,包含复制的元素 从指定的集合,并有足够的容量 容纳复制的元素数量。
【讨论】:
以上是关于哈希集的浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章