0

私は列挙型を持っています

enum MyEnum
{
  a=1,
  b=2,
  c=3
}

たとえば、この列挙型に変数を設定します

MyEnum myEnum = MyEnum.b

次に、コードでこの値を 1 減らします

そう、

列挙型が c (3) に設定されていた場合、b (2) に設定されます。

列挙型が b (2) に設定されていた場合、今度は a (1) に設定されます。

私が探していたのはきちんとした言い方だった

列挙型が a (1) に設定されていた場合、c (3) に設定されます。

このデクリメント関係を循環させる簡潔な方法が必要です。

4

3 に答える 3

1

このシナリオでは、簡潔は理解できるものとはまったく異なります。

(MyEnum)((((int)myEnum+1) % 3) + 1)

説明

まず、この式は列挙型をその整数表現にキャストしています。次に、1 を減算して列挙値を 0 にリベースし、モジュール演算子 ( %) が機能するようにします。次に、あなたが言及した減算操作を実行しています(-1)。負のオペランドを避けるために、モジュラス演算を適用した後に効果がない 3 を追加します。これら 3 つの操作を組み合わせると、1 を足すのと同じです。その後、モジュール操作を実行し、探している循環プロパティを実現します。次に、(1 を追加することによって) 値を再び 1 から開始するようにリベースし、最終的に結果の数値を MyEnum にキャストし直します。

列挙型がより多くの値を持つとどうなりますか?

この式は、列挙型が 3 で終わることを前提としています。より多くの項目を持つ列挙型に使用する場合は、少しリフレクションを使用する必要があり、おそらくそれをメソッドに抽出する必要があります。

MyEnum PreviousMyEnum(MyEnum myEnum)
{
    int maxValue = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Max();
    return (MyEnum)((((int)myEnum -2 + maxValue) % maxValue) + 1);
}
于 2013-04-07T00:35:40.977 に答える
1

私はおそらく条件付きを使用するでしょう。それは非常に明確で、特に冗長ではありません。

myEnum = myEnum==MyEnum.a ? MyEnum.c : (MyEnum)(int)myEnum-1;

Enum.GetValues() を使用してこれを汎用にするのは簡単です。上記の具体的な例は、私が思うに最も明確にアイデアを伝えています。

于 2013-04-07T01:03:26.747 に答える
1
int howManyYouWant = 20;

  //just get the enum values...
IEnumerable<MyEnum> someEnums = Enum
  .GetValues(typeof(MyEnum))
  .Cast<MyEnum>();

  //figure out how many times we go through the whole set to meet desired amount
int numberOfRepeats = 1 + (howManyYouWant / someEnums.Count());

IEnumerable<MyEnum> manyEnums = Enumerable
  .Repeat(someEnums.Reverse(), numberOfRepeats)    //repeat the reverse of the set
  .SelectMany(x => x)    //unpack those sets into one set.
  .Take(howManyYouWant);  //and take what you wanted.

foreach(MyEnum x in manyEnums)
{
 ...
}
于 2013-04-07T01:07:51.350 に答える