0

使用しているメソッドで範囲を使用していますが、マネージャーから整数の代わりに列挙型を使用するように求められたため、次のようになりました。

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には他のメソッド(つまり、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
        }  
    };

その配列の初期化中にエラーが発生しますが、これを実現する他の方法はありますか?可能であれば、3つの列挙型にすることは避けたいと思いますが、やむを得ない場合は、次のように処理します。

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

レンチを使って釘を打つように言われています(さらに悪いことに、言われています)。動作しますが、不快であり、前述のように、これは列挙型の適切な使用法ではありません。

これが範囲を定義してチェックする一般的なアプリケーションである場合は、範囲をクラスにカプセル化することをお勧めします(これはおそらく、最小値と最大値のプロパティのペア、および値をチェックするためのメソッドです。範囲などに対して)、それを使用します。

于 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 に答える