如何判断给定值是否存在于Department类的常量列表中
问题描述
现有如下C#静态类Department,包含多个int类型常量:
public static class Department { #region Public Constants public const int Paperback = 1; public const int Hardcover = 2; public const int Music = 3; #endregion }
需要在该类中实现一个Exists静态方法,用于判断传入的int值是否属于上述常量列表。例如执行以下代码时:
int? Dept = 4; var availableDepartment= Department.Exists(Dept.Value);
因为4不在常量范围内,availableDepartment应返回false。
实现方案
方案一:硬编码常量集合(推荐,性能最优)
直接把所有常量值存入哈希集合,Exists方法通过集合的Contains方法快速判断:
public static class Department { #region Public Constants public const int Paperback = 1; public const int Hardcover = 2; public const int Music = 3; #endregion private static readonly HashSet<int> _validDepartments = new HashSet<int> { Paperback, Hardcover, Music }; public static bool Exists(int deptId) { return _validDepartments.Contains(deptId); } }
- 优点:哈希查找性能极高,无额外开销
- 缺点:后续新增常量时,需要手动同步更新
_validDepartments集合
方案二:反射自动获取常量(灵活,无需手动维护集合)
如果希望新增常量时不用修改Exists相关代码,可以通过反射自动提取类中所有int类型的常量值:
public static class Department { #region Public Constants public const int Paperback = 1; public const int Hardcover = 2; public const int Music = 3; #endregion private static readonly Lazy<HashSet<int>> _validDepartments = new Lazy<HashSet<int>>(() => { var constants = typeof(Department) .GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static) .Where(f => f.IsLiteral && !f.IsInitOnly && f.FieldType == typeof(int)) .Select(f => (int)f.GetValue(null)) .ToHashSet(); return constants; }); public static bool Exists(int deptId) { return _validDepartments.Value.Contains(deptId); } }
- 优点:新增常量时无需修改
Exists逻辑,扩展性强 - 缺点:首次调用时会有反射的性能开销,但通过
Lazy<T>确保仅执行一次反射操作
额外优化建议:改用枚举类型(更符合C#设计规范)
如果业务场景允许,更推荐将这些常量替换为枚举类型,天然具备值校验能力:
public enum Department { Paperback = 1, Hardcover = 2, Music = 3 }
此时判断值合法性可直接使用内置方法:
int? Dept = 4; var availableDepartment = Enum.IsDefined(typeof(Department), Dept.Value);
枚举类型不仅符合C#类型安全设计,还自带值校验、字符串转换等实用能力,是该场景下的更优解。
内容的提问来源于stack exchange,提问作者Sandy
相关产品推荐
相关产品推荐

