一个数减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)

我想用一种简洁的方式使递减关系循环。

一个数减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);
}
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()使其泛型。我认为上面的具体例子最清楚地表达了这个想法。

相关文章: