将数字减少1

时间:2013-04-07 00:31:17

标签: c#

我有一个枚举

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

我为此枚举设置了一个变量,例如

MyEnum myEnum = MyEnum.b

然后我在代码

中将此值减1

所以,

如果将枚举设置为c(3),则现在将其设置为b(2)

如果将枚举设置为b(2),则现在将其设置为(1)

我正在寻找的是一种简洁的说法

如果将枚举设置为a(1),则现在将其设置为c(3)

我想要一个简短的方法来使这个减量关系循环。

3 个答案:

答案 0 :(得分:1)

在这种情况下,简洁与完全不同:

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

<强>解释

首先,这个表达式将枚举转换为它的整数表示。然后,它减去1以将枚举值重新定义为0,以便模块运算符(%)起作用。然后它执行你提到的减法操作(-1)。为了避免负操作数,它增加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);
}

答案 1 :(得分:1)

我可能会使用条件。它非常清楚,并不是特别冗长。

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

使用Enum.GetValues()很容易使其成为通用的。上面的具体例子我认为最明显的想法。

答案 2 :(得分: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)
{
 ...
}