0

我正在使用带有我正在使用的方法的范围,并且我的经理要求我使用 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
    };
4

3 回答 3

2

我认为静态常量方法非常简单,但它也消耗大量代码,并且很难立即接受。这是一种更紧凑的替代方法——静态列表将比一堆 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;

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

于 2012-07-16T15:44:15.297 回答
1

你被要求(或更糟的是,被告知)用扳手敲钉子。它会起作用,但令人不快,正如已经提到的,这不适合用于枚举。

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

于 2012-07-16T15:36:38.113 回答
1

听起来您想要常量或静态只读,而不是枚举。下面未经测试的代码,但这应该如下工作: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;
        }  
    }
}

也就是说,类似于此 CodeProject 文章中描述的 Range 类将更适合您的用例。

于 2012-07-16T15:31:09.327 回答