参考文章HashSet<T> 类 (System.Collections.Generic) | Microsoft Learn
HashSet
是 C# 中的一种集合类型,位于 System.Collections.Generic
命名空间内。它主要用于存储一组不重复的元素,这些元素没有固定的顺序。HashSet
是基于哈希表实现的,这意味着它的内部结构允许高效的查找、添加和删除操作,通常情况下这些操作的时间复杂度接近 O(1),即常数时间复杂度。
构造函数
HashSet<T>() | 初始化 HashSet<T> 类的新实例,该实例为空,并为集类型使用默认相等比较器。 |
HashSet<T>(IEnumerable<T>) | 初始化 HashSet<T> 类的新实例,该实例使用集类型的默认相等比较器,包含从指定集合复制的元素,并且有足够的容量来容纳复制的元素数。 |
HashSet<T>(IEnumerable<T>, IEqualityComparer<T>) | 初始化 HashSet<T> 类的新实例,该实例使用集类型的指定相等比较器,包含从指定集合复制的元素,并且有足够的容量来容纳复制的元素数。 |
HashSet<T>(IEqualityComparer<T>) | 初始化 HashSet<T> 类的新实例,该实例为空,并为集类型使用指定的相等比较器。 |
HashSet<T>(Int32) | 初始化 HashSet<T> 类的新实例,该实例为空,但为 |
HashSet<T>(Int32, IEqualityComparer<T>) | 初始化 HashSet<T> 类的新实例,该实例使用集类型的指定相等比较器,并且有足够的容量来容纳 |
HashSet<T>(SerializationInfo, StreamingContext) | 已过时. 使用序列化的数据初始化 HashSet<T> 类的新实例。 |
方法
以下是 HashSet
的一些主要特点和操作:
-
唯一性:
HashSet
中的每个元素都是唯一的,试图向HashSet
中添加一个已经存在的元素不会改变HashSet
的状态,同时返回false
表示添加操作未能成功执行。 -
无序性:虽然元素是以某种内部结构存储的,但
HashSet
不保证元素的存储顺序,元素的存储顺序可能与插入顺序不同。 -
高效性:由于
HashSet
内部使用哈希表实现,所以它提供了非常快的查找、插入和删除操作。 -
集合操作:
HashSet
提供了一系列集合操作方法,比如UnionWith
(并集)、IntersectWith
(交集)、ExceptWith
(差集)、IsSubsetOf
(是否为子集)、IsSupersetOf
(是否为超集)、Overlaps
(重叠)等。 -
初始化:可以通过多种方式初始化
HashSet
,包括直接创建空的HashSet
,或者通过集合初始化器一次性添加多个元素。 -
遍历:可以使用
foreach
循环遍历HashSet
中的元素,但不能通过索引访问元素,因为HashSet
不支持索引。 -
容量调整:
HashSet
可以自动调整其内部存储容量以适应元素数量的变化。
示例代码
以下是一个简单的 HashSet
使用示例,展示了如何创建、添加元素、检查元素是否存在以及执行集合操作:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 创建一个整数类型的 HashSet
HashSet<int> numbers = new HashSet<int>();
// 添加元素
numbers.Add(1);
numbers.Add(2);
numbers.Add(3);
// 尝试添加一个已存在的元素
bool added = numbers.Add(2); // 返回 false,因为元素 2 已经存在
// 检查元素是否存在
bool exists = numbers.Contains(2); // 返回 true
// 执行集合操作
HashSet<int> moreNumbers = new HashSet<int> { 3, 4, 5 };
numbers.UnionWith(moreNumbers); // 合并两个集合
// 输出集合中的所有元素
foreach (int num in numbers)
{
Console.WriteLine(num);
}
// 输出结果可能是:1 2 3 4 5(顺序不定)
}
}
在这个例子中,numbers
和 moreNumbers
两个 HashSet
通过 UnionWith
方法合并成了一个更大的集合。注意输出的结果中元素的顺序不是固定的,因为 HashSet
不保证元素的顺序。