我有一个枚举
enum MyEnum
{
a=1,
b=2,
c=3
}
我为此枚举设置了一个变量,例如
MyEnum myEnum = MyEnum.b
然后我在代码
中将此值减1所以,
如果将枚举设置为c(3),则现在将其设置为b(2)
如果将枚举设置为b(2),则现在将其设置为(1)
我正在寻找的是一种简洁的说法
如果将枚举设置为a(1),则现在将其设置为c(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)
{
...
}