【问题标题】:Can you make an array of enumerated values?你能做一个枚举值数组吗?
【发布时间】:2012-07-16 15:25:36
【问题描述】:

我正在使用带有我正在使用的方法的范围,我的经理要求我使用 Enum 而不是整数,所以不要使用这个:

public virtual int MyMethod(int value)
    {
        int result = 0;

        if (value >= 0 && value <= 3333)
        {
            result = 1;
        }
        else if (value >= 3334 && value <= 6666)
        {
            result = 2;
        }
        else if (value >= 6667 && value <= 10000)
        {
            result = 3;
        }
        return result;
    }

我使用这样的东西:

public virtual int MyMethod(int value)
    {
        int result = 0;

        if (value >= (int)EnumClass.Range.Low.Min && value <= (int)EnumClass.Range.Low.Max)
        {
            result = 1;
        }
        else if (value >= (int)EnumClass.Range.Medium.Min && value <= (int)EnumClass.Range.Medium.Max)
        {
            result = 2;
        }
        else if (value >= (int)EnumClass.Range.High.Min && value <= (int)EnumClass.Range.High.Max)
        {
            result = 3;
        }
        return result;
    }

EnumClass 有其他 Enum 用于其他方法(即 Rating、Priority),所以我希望 Range 保持它自己的变量,有点像这样:

public static enum Rating
    {
        Low = 1,
        Medium,
        High
    };

public static enum[] Range =
    {
        enum Low
        {
            Min = 0,
            Max = 3333
        },

        enum Medium
        {
            Min = 3334,
            Max = 6666
        },

        enum High
        {
            Min = 6667,
            Max = 10000
        }  
    };

但是,在初始化该数组时出现错误,那么还有其他方法可以实现吗?如果可能的话,我想避免将它们设为三个 Enum,但如果不可避免,我会使用这个:

public static enum Rating
    {
        Low = 1,
        Medium,
        High
    };
public static enum RangeLow
    {
        Min = 0,
        Max = 3333
    };
public static enum RangeMedium
    {
        Min = 3334,
        Max = 6666
    };
public static enum RangeHigh
    {
        Min = 6667,
        Max = 10000
    };

【问题讨论】:

  • 数组包含一个的列表;您似乎在要求一个包含 types 列表的数组。
  • 你的经理不是程序员。您不希望在此处使用枚举,因为这不是枚举。您需要一组具有适当名称的常量。
  • @Skizz 不,他不是。我也想使用常量,但他坚持使用 Enum。

标签: c# arrays enums


【解决方案1】:

我认为静态常量方法非常简单,但它也消耗大量代码行并且很难立即接受。这是一种更紧凑的替代方法——静态列表将比一堆 else-if 语句更简单、更清晰:

// The various thresholds from your previous if statement.
var list = new List<int>() { 0, 3333, 6666, 10000 };
var min  = list.First();
var max  = list.Last();

现在你可以这样做了:

return (value >= min && value <= max) ?
  list.TakeWhile(p => p < value).Count() :
  0;

(P.S. 为什么你的经理决定实施决策,比如是否使用枚举,尤其是当它是一个非常有问题的用法时?除非你做的事情严重错误,否则这感觉就像是一些相当严厉的微观管理。)

【讨论】:

  • 实际上就是这样。并感谢您的替代方法;我看看能不能改用这个。
  • 请注意,如果您要返回的值实际上不是 0、1、2、3 等,只需修改第二行,使其进行相应映射。
【解决方案2】:

您被要求(或更糟的是,被告知)使用扳手敲钉子。它可以工作,但令人不快,正如前面提到的,这不适用于枚举。

我建议,如果这是一个常见的应用程序,定义了一个范围并对其进行检查,那么您将范围封装在一个类中(这可能只是最小值和最大值的一对属性,以及方法用于根据范围检查值等等),然后使用它。

【讨论】:

  • 您可以扩展它,使 Range 类型为 {min,max,result},然后使用适当的值初始化它们的数组。更好的是(如果您想创业)从 XML 文件(或 JSON 等)读取数据。然后 MyMethod 成为 Ranges 数组的迭代。有用的是以后需要添加更多范围或范围值发生变化。
  • 我现在就这么做。谢谢。
【解决方案3】:

听起来您想要常量或静态只读,而不是枚举。下面是未经测试的代码,但这应该如下工作:var foo = Range.Low.Min;

public static class EnumClass 
{
    public static class Range
    {
        public static class Low
        {
            public static readonly int Min = 0;
            public static readonly int Max = 3333;
        }

        public static class Medium
        {
            public static readonly int Min = 3334;
            public static readonly int Max = 6666;
        }

        public static class High
        {
            public static readonly int Min = 6667;
            public static readonly int Max = 10000;
        }  
    }
}

也就是说,this CodeProject article 中描述的 Range 类更适合您的用例。

【讨论】:

  • 这个解决方案的问题是我的经理希望项目中使用的所有枚举都在一个类(EnumClass)中,因此我不能只为 Range 创建一个类,否则我会五。
  • 我编辑了我的答案以展示如何将它们全部嵌套在 EnumClass 类中
猜你喜欢
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
相关资源
最近更新 更多