0

我有一个枚举

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

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

MyEnum myEnum = MyEnum.b

然后我在我的代码中将此值减一

所以,

如果一个枚举被设置为 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,这在应用模数运算后将不起作用。将这三个操作组合起来与添加 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 回答