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

如何判断给定值是否存在于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:22:35