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

相关推荐
北漂Zachary12 小时前
四大编程语言终极对决:汇编/C#/Go/Java谁更强
汇编·golang·c#
RReality14 小时前
【Unity UGUI】Toggle / ToggleGroup 与 Dropdown
ui·unity·游戏引擎·图形渲染·材质
雪儿waii15 小时前
Unity 中的 InvokeRepeating 详解
unity·游戏引擎
mxwin15 小时前
Unity Shader 程序化生成:Shader 中的数学宇宙
unity·游戏引擎
nnsix15 小时前
C# ProcessStartInfo对象笔记
开发语言·笔记·c#
格林威16 小时前
工业相机“心跳”监测脚本(C# 版) 支持海康 / Basler / 堡盟工业相机
开发语言·人工智能·数码相机·opencv·计算机视觉·c#·视觉检测
雪儿waii17 小时前
Unity 中的 Quaternion(四元数)详解
unity·游戏引擎
RReality17 小时前
【Unity UGUI】ScrollRect 与 Scrollbar 深度用法
unity·游戏引擎
人邮异步社区17 小时前
如何自学游戏引擎的开发?
unity·程序员·游戏引擎
刚子编程18 小时前
C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生
开发语言·c#·事务处理·trycatch