C#语法:HashSet与List对比,适合场景

在 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> 是泛型集合,适用于多种类型。

相关推荐
半亩码田1 小时前
C#转Python第3.6篇:Python 的 @property 比 C# 的 get/set 更灵活
java·python·c#
楠楠子呀6 小时前
独立站聊天转化全链路:从二维码引流到数据复盘
java·javascript·数据仓库·python·c#·自动化·etl
csdn_aspnet6 小时前
C# 第k个最小元素(K’th Smallest Element)
算法·c#·排序算法
Madokaly7 小时前
基类 DG.Tweening.Tween的源码解读
unity
影寂ldy7 小时前
Modbus-ASCII 协议 + LRC校验
笔记·网络协议·c#
自己的九又四分之三站台7 小时前
C# 接入 RasterLite2:从原生 DLL 加载到 Coverage、Section、Tile 验证
开发语言·c#·地理信息
好名字都被猪取了-8 小时前
# C# 全栈开发资源包(.NET8/.NET10)
c#
Behaviour8 小时前
Unity游戏之Jenkins的安装部署应用
游戏·unity·jenkins
淡海水9 小时前
03-05-线性-Array-List-LinkedList与Span-所有权与成本模型选型
c#·list·编译·array·clr·机器码