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

相关推荐
唐青枫12 小时前
别只会看日志:C#.NET SOS 调试扩展从 Dump 到内存泄漏排查
c#·.net
yswenli19 小时前
基于C#开发网站视频嗅探下载工具——BrowserVideoGrabber
c#·videodownload·webvideodownload·videograbber
Lost of 程序猿19 小时前
M2 实战:询价与采购订单聚合落地——跨聚合一致性、领域事件与 Outbox
开发语言·c#·asp.net·.net
Polevne1 天前
C# GRPC 一元与双向流
linux·算法·c#
新的瑞拉公主1 天前
Unity游戏发布微信小游戏:从构建到提审
unity·webgl·微信小游戏·开放数据域
XiaoZhenHua982 天前
C#工业机器视觉Recipe配方系统设计:多型号、多相机、多工位参数如何统一管理
c#·软件架构·机器视觉·工业自动化·工业软件·recipe
fujisheng6612 天前
FUI 导航实践:拆开 Layer、History、Coverage 与 Cache 的组合语义
c#·unity3d
淡海水2 天前
10-05-高级-模式匹配-CSharp如何改变与数据结构的交互方式
数据结构·算法·c#·模式匹配
XiaoZhenHua982 天前
C# WinForms + 西门子S7 + SQLite + EPPlus生产数据采集系统架构设计
系统架构·sqlite·c#
Lost of 程序猿2 天前
船岸数据同步链路实战:SendFlag、单调版本号与断网三天后的续传
后端·c#·asp.net