在 C# 里,如果我们有一组固定的字符串,并且需要频繁判断"某个字符串是否在这组数据里",很多人第一反应会写成 List<string>.Contains(...)或者for循环判断。
这种写法当然没错,但如果这个判断出现在循环、递归或者高频调用的方法里,更合适的选择通常是 HashSet<string>。
一、实例
cs
public static List<string> AnatomyTypeIds = new()
{
"organ_system-5000",
"lymphatic_system-5122",
"muscle_system-5376",
"articulation_system-6100",
"skeletal_system-7426",
"arterial_system-6416",
"venous_system-6978",
"heart_system-7398",
"peripheral_nervous_system-7409"
};
private HashSet<string> AnatomyTypeIdsSet =
new HashSet<string>(AnatomyTypeIds);
public bool IsAnatomyTypeId(string modelId) =>
AnatomyTypeIdsSet.Contains(modelId);
用法跟 List<string>.Contains都差不多
二、HashSet<string> 到底是什么
`HashSet<string>`` 是一个"集合"类型。
它最核心的特点不是"保存顺序",而是:
- 用来存一组不重复的值
- 适合做"某个值是否存在"的判断
- Contains(...) 的查找效率通常很高
可以把它理解成一个"查名单"的结构。
如果你只是想问:
"这个字符串在不在这组字符串里?"
那 HashSet<string> 往往比 List<string> 更适合。
三、它和 List<string> 的区别
很多时候,List<string> 和 HashSet<string> 都能完成任务,但它们擅长的方向不同。
List<string> 更适合这些情况
- 你关心元素顺序
- 你需要按索引访问
- 你主要是遍历,不是频繁查成员
- 数据量很小,而且只判断几次
HashSet<string> 更适合这些情况
- 你主要操作是 Contains
- 你会频繁判断"某个字符串在不在集合里"
- 你不关心顺序
- 你希望自动去重
一句话总结就是:
List<string> 更像"有顺序的名单",
HashSet<string> 更像"快速验票名单"。
本文用 HashSet<string> 做示例,但本质上 HashSet<T> 是泛型集合,适用于多种类型。