在C#开发中,HashSet是一个常用的集合类型,它基于哈希表实现,存储的元素具有唯一性,不会存在重复值,同时支持高效的添加、删除、查找操作,还内置了多种集合运算方法,非常适合处理需要去重或者集合操作的场景。

HashSet的基本创建与初始化
使用HashSet前需要先引入System.Collections.Generic命名空间,我们可以通过无参构造函数创建空集合,也可以在初始化时传入初始元素。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 创建空的HashSet
HashSet<int> emptySet = new HashSet<int>();
// 初始化时添加元素
HashSet<string> initSet = new HashSet<string> { "apple", "banana", "orange" };
Console.WriteLine("初始集合元素:");
foreach (var item in initSet)
{
Console.WriteLine(item);
}
}
}
使用HashSet实现数据去重
HashSet最核心的特性就是元素唯一,当我们向集合中添加重复元素时,添加操作会返回false,且集合不会发生变化,利用这个特性可以很方便地实现数据去重。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> rawData = new List<int> { 1, 2, 3, 2, 4, 1, 5, 3 };
HashSet<int> distinctSet = new HashSet<int>(rawData);
Console.WriteLine("去重后的元素:");
foreach (var num in distinctSet)
{
Console.WriteLine(num);
}
// 尝试添加重复元素
bool addResult = distinctSet.Add(2);
Console.WriteLine($"添加重复元素2的结果:{addResult}"); // 输出False
Console.WriteLine($"添加后集合元素数量:{distinctSet.Count}"); // 数量不变
}
}
HashSet的集合运算方法
HashSet内置了多种集合运算方法,无需手动编写循环即可完成并集、交集、差集等操作,常用方法如下:
- UnionWith:计算当前集合与另一个集合的并集,结果保存到当前集合
- IntersectWith:计算当前集合与另一个集合的交集,结果保存到当前集合
- ExceptWith:计算当前集合与另一个集合的差集,结果保存到当前集合
- SymmetricExceptWith:计算当前集合与另一个集合的对称差集(仅在一个集合中的元素),结果保存到当前集合
- IsSubsetOf:判断当前集合是否是另一个集合的子集
- IsSupersetOf:判断当前集合是否是另一个集合的超集
集合运算示例
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
HashSet<int> setA = new HashSet<int> { 1, 2, 3, 4 };
HashSet<int> setB = new HashSet<int> { 3, 4, 5, 6 };
// 并集运算
HashSet<int> unionSet = new HashSet<int>(setA);
unionSet.UnionWith(setB);
Console.WriteLine("并集结果:");
PrintSet(unionSet); // 输出1,2,3,4,5,6
// 交集运算
HashSet<int> intersectSet = new HashSet<int>(setA);
intersectSet.IntersectWith(setB);
Console.WriteLine("交集结果:");
PrintSet(intersectSet); // 输出3,4
// 差集运算 setA - setB
HashSet<int> exceptSet = new HashSet<int>(setA);
exceptSet.ExceptWith(setB);
Console.WriteLine("差集结果(setA - setB):");
PrintSet(exceptSet); // 输出1,2
// 对称差集运算
HashSet<int> symmetricSet = new HashSet<int>(setA);
symmetricSet.SymmetricExceptWith(setB);
Console.WriteLine("对称差集结果:");
PrintSet(symmetricSet); // 输出1,2,5,6
// 子集判断
HashSet<int> subSet = new HashSet<int> { 1, 2 };
Console.WriteLine($"subSet是否是setA的子集:{subSet.IsSubsetOf(setA)}"); // 输出True
}
static void PrintSet(HashSet<int> set)
{
foreach (var item in set)
{
Console.Write(item + " ");
}
Console.WriteLine();
}
}
HashSet的常用属性和方法总结
除了上述提到的功能,HashSet还有以下常用属性和方法:
| 属性/方法 | 说明 |
|---|---|
| Count | 获取集合中元素的数量 |
| Add(T item) | 向集合中添加元素,添加成功返回true,元素已存在返回false |
| Remove(T item) | 从集合中移除指定元素,移除成功返回true,元素不存在返回false |
| Contains(T item) | 判断集合是否包含指定元素,包含返回true,否则返回false |
| Clear() | 清空集合中的所有元素 |
使用注意事项
在使用HashSet时需要注意,HashSet不保证元素的存储顺序,遍历输出的顺序不一定和添加顺序一致。如果需要有序的唯一集合,可以考虑使用SortedSet。另外,HashSet中的元素类型需要正确实现GetHashCode和Equals方法,否则可能导致去重和集合运算结果不符合预期。