HashSet

HashSet

定义

命名空间: System.Collections.Generic
程序集: System.Collections.dll

类型参数

T(哈希集中的元素类型)

注释

类 HashSet 提供高性能集操作。 集是不包含重复元素且其元素没有特定顺序的集合。
元素唯一,不重复,区分大小写
不能使用下标来访问元素(for循环不可使用)

备注:
HashSetIReadOnlyCollection实现从 .NET Framework 4.6 开始的 接口;在早期版本的 .NET Framework中HashSet, 类未实现此接口。

HashSet对象可容纳的元素数量,当添加元素时会自动增加。但是不会自动减少
HashSet类可被视为没有Dictionary<TKey,TValue>值的集合。
集合HashSet未排序,并且不能包含重复的元素。如果顺序或元素重复比应用程序的性能更重要,请考虑将List类与Sort方法一起使用。

HashSet 提供了许多数学集运算,如下:

HashSet 操作 数学等效项
UnionWith 联合或集添加
IntersectWith 交叉 口
ExceptWith 设置减法
SymmetricExceptWith 对称差异

仅.NET Framework: 对于非常大HashSet的对象,可以通过在运行时环境中将配置元素的 属性设置为 enabled ,将 64 位系统上的最大容量增加到 true 20 亿个元素。

从 .NET Framework 4 开始, HashSet 类实现 ISet 接口。

HashSet 和 LINQ Set 运算

LINQ 集操作和 HashSet 操作之间的主要区别在于,LINQ 集操作始终返回新 IEnumerable 集合,而 HashSet 等效的方法会修改当前集合。

HashSet 操作 LINQ 等效项
UnionWith Union
IntersectWith Intersect
ExceptWith Except
未提供。 Distinct
SymmetricExceptWith 未提供。
Overlaps 未提供。
IsSubsetOf 未提供。
IsProperSubsetOf 未提供。
IsSupersetOf 未提供。
IsProperSupersetOf 未提供。
SetEquals 未提供。

HashSet 的优势和与 List 的比较

HashSet 最大的优势是检索的性能,简单的说它的 Contains 方法的性能在大数据量时比 List 好得多。

在内部算法实现上,HashSet 的 Contains 方法复杂度是 O(1),List 的 Contains 方法复杂度是 O(n),后者数据量越大速度越慢,而 HashSet 不受数据量的影响

这里的方法复杂度就是 时间复杂度 和 空间复杂度 的综合评定,时间复杂度 和 空间复杂度怎么定义,可以百度一下,这里不做讲解

所以在集合的目的是为了检索的情况下,我们应该使用 HashSet 代替 List 。比如一个存储关键字的集合,运行的时候通过其 Contains 方法检查输入字符串是否关键字。

代码展示

#region 添加元素
Console.WriteLine("1. 添加元素 \r\n ");
var set = new HashSet<string>();
// Add 方法会返回 bool值,添加数据时,如果集合中已经存在,则忽略这次操作,并返回false
// 无法添加不同数据类型的元素
// set.Add(8);
set.Add("a");
set.Add("b");
set.Add("c");
set.Add("d");
set.Add("A");
FHashSet(set); // 打印元素
SignLine(); // 分割线
#endregion
#region 检查元素是否存在
Console.WriteLine("2. 集合中是否存在 a 元素?");
if (set.Contains("a"))
Console.WriteLine("是");
else
Console.WriteLine("否");
SignLine();
#endregion
#region 将当前集合的容量设置为它包含的实际元素数
Console.WriteLine("将当前集合的容量设置为它包含的实际元素数: \r\n");
var set2 = new HashSet<string>(10);
set2.Add("A");
set2.Add("B");
set2.Add("C");
set2.TrimExcess();
SignLine();
#endregion
#region 移除当前集合中包含指定集合的元素
Console.WriteLine("移除当前集合中包含指定集合的元素: \r\n");
string[] strs = { "a", "b" };
set.ExceptWith(strs);
FHashSet(set2);
SignLine();
#endregion
#region 修改为两个集合之间的交集
Console.WriteLine("修改为两个集合之间的交集: \r\n");
string[] str2 = { "异", "A", "B", "C", "E", "E" };
set.IntersectWith(str2);
FHashSet(set);
SignLine();
#endregion
#region 修改为两个集合之间的并集
Console.WriteLine(" 6.修改为两个集合之间的并集: \r\n");
Console.WriteLine(" set : A, B, C, E, D 长度:{0}", set.Count);
Console.WriteLine(" set2: 1, A, 2, B 长度:{0}", set2.Count);
set.UnionWith(set2);
FHashSet(set);
#endregion

结果:
img

posted @   skc-6  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示