作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个这样定义的枚举:
public enum eRat { A = 0, B=3, C=5, D=8 };
所以给定值 eRat.B
,我想得到下一个值 eRat.C
我看到的解决方案是(没有范围检查)
Array a = Enum.GetValues(typeof(eRat));
int i=0 ;
for (i = 0; i < a.GetLength(); i++)
{
if (a.GetValue(i) == eRat.B)
break;
}
return (eRat)a.GetValue(i+1):
对于这么简单的事情来说,这太复杂了。你知道更好的解决方案吗?像 eRat.B+1
或 Enum.Next(Erat.B)
这样的东西?
谢谢
最佳答案
感谢大家的回答和反馈。我很惊讶能得到这么多。查看它们并使用其中的一些想法,我想出了这个最适合我的解决方案:
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;
return (Arr.Length==j) ? Arr[0] : Arr[j];
}
}
这种方法的美妙之处在于它简单且易于使用。作为通用扩展方法实现,您可以通过这种方式在任何枚举上调用它:
return eRat.B.Next();
注意,我使用的是通用扩展方法,因此我不需要在调用时指定类型,只需.Next()
即可。
关于c# - 如何在 C# 中获取下一个(或上一个)枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/642542/
我是一名优秀的程序员,十分优秀!