一个数减1
本文关键字:一个 | 更新日期: 2023-09-27 18:07:44
我有一个enum
enum MyEnum
{
a=1,
b=2,
c=3
}
我为这个enum设置了一个变量,例如
MyEnum myEnum = MyEnum.b
然后在我的代码
中将该值减1如果一个enum被设置为c(3),它现在将被设置为b (2)
如果一个enum被设置为b(2),它现在将被设置为a (1)
我想用一种简洁的方式来表达
如果一个enum被设置为a(1),它现在将被设置为c (3)
我想用一种简洁的方式使递减关系循环。
在这种情况下,简洁与可理解完全不同:
(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);
}
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)
{
...
}
我可能会使用条件语句。它非常清晰,而且不是特别啰嗦。
myEnum = myEnum==MyEnum.a ? MyEnum.c : (MyEnum)(int)myEnum-1;
很容易使用enumt . getvalues()使其泛型。我认为上面的具体例子最清楚地表达了这个想法。