You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动用C#枚举值初始化只读HashSet?

没问题,这事儿很好解决——你完全可以借助Enum.GetValues来实现自动填充,不用再手动维护枚举值列表!

核心解决方案

因为Enum.GetValues返回的是Array类型,咱们只需要做一步强类型转换,就能直接喂给HashSet的构造函数,完美适配你的只读字段初始化要求:

// 基础版:只读字段,自动同步枚举所有值
private readonly HashSet<MyColors> _allColors = new HashSet<MyColors>(Enum.GetValues(typeof(MyColors)).Cast<MyColors>());

如果还想让这个集合外部完全无法修改(比如防止不小心调用Add/Remove),可以把它包装成只读集合类型:

// 进阶版:外部无法修改的只读集合
private readonly IReadOnlySet<MyColors> _allColors = new HashSet<MyColors>(Enum.GetValues(typeof(MyColors)).Cast<MyColors>());

或者用HashSet自带的AsReadOnly()方法生成只读包装:

private readonly IReadOnlySet<MyColors> _allColors = new HashSet<MyColors>(Enum.GetValues(typeof(MyColors)).Cast<MyColors>()).AsReadOnly();

更简洁的写法(C# 7.3+)

如果你用的是C# 7.3及以上版本,还可以用泛型版的Enum.GetValues<T>(),代码更清爽,不需要额外的Cast操作:

private readonly HashSet<MyColors> _allColors = new HashSet<MyColors>(Enum.GetValues<MyColors>());

原理说明

  • Enum.GetValues(typeof(MyColors))会返回该枚举所有有效值的数组,通过Cast<MyColors>()(或者泛型版本直接返回)把非泛型数组转换成强类型的IEnumerable<MyColors>,完全符合HashSet构造函数的参数要求。
  • 因为是在字段初始化阶段完成的赋值,完全满足你“只读字段必须在定义时初始化”的要求。后续你给MyColors新增枚举值,编译后这个HashSet会自动包含新值,再也不用手动同步啦!

内容的提问来源于stack exchange,提问作者lilotop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:31:27