【问题标题】:Get Next item in Enum and return first if last+1获取枚举中的下一项,如果 last+1 则首先返回
【发布时间】:2018-11-08 15:03:52
【问题描述】:

我看到How to get next (or previous) enum value in C# 并且想知道如果下一个项目是 (last+1) 是否也可以返回第一个项目。想象一下:

public enum MODE {
    OFF,
    CHANNEL,
    TALKING
}

MODE Mode = MODE.OFF;

Mode = Mode.Next(); // should give me MODE.CHANNEL
Mode = Mode.Next(); // should give me MODE.TALKING
Mode = Mode.Next(); // should give me MODE.OFF

【问题讨论】:

  • 这是循环,可以通过添加ifEnum.IsDefined进行正常迭代。

标签: c# enums


【解决方案1】:

模算术添加到husayt的答案

How to get next (or previous) enum value in C#

代码:

public static class Extensions {
  public static T Next<T>(this T src) where T : struct {
    if (!typeof(T).IsEnum)
      throw new ArgumentException(String.Format("Argument {0} is not an Enum", 
                                                 typeof(T).FullName));

    T[] Arr = (T[])Enum.GetValues(src.GetType());

    int j = (Array.IndexOf<T>(Arr, src) + 1) % Arr.Length; // <- Modulo % Arr.Length added

    return Arr[j];
  }
}

【讨论】:

  • 嗯,它似乎不起作用: "Blu": !acc toggle "Dvni": AutoChannelCommander 现在是 CHANNEL “Blu”:!acc 切换 “Dvni”:AutoChannelCommander 现在正在通话 “Blu”:!acc 切换
  • @Bluscream:对不起?
  • Nvm,我错过了你的编辑。现在它工作得很好。非常感谢!
  • 一个很好的答案,但我反对将此作为扩展方法,因为您不能让编译器强制执行它应该只适用于枚举的规则。令人困惑的是,您可以执行 1.Next() 之类的操作,它编译得很好,但在运行时会失败。
  • @Matt Burland:另一个 7.3 改进是 where T: Delegate
【解决方案2】:

也许这可能有用:

    static void Main(string[] args)
    {
        MODE Mode = MODE.TALKING; //Whatever value;
        int index = (int)Mode;
        index = ++index % 3;
        Mode = (MODE)index;
        Console.WriteLine("Mode value {0} ; index {1}", Mode, index );
        Console.ReadKey();

    }

【讨论】:

  • 实现新方法只是一个想法。
猜你喜欢
  • 2012-10-17
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
相关资源
最近更新 更多