下一个或上一个枚举

给定已分配值的枚举,给出值的下一个或上一个枚举的最佳方法是什么。 例如,考虑这个枚举:

public enum TimeframeType { None = 0, [Description("1 month")] Now = 30, [Description("1-3 months")] Short = 90, [Description("3-6 months")] Medium = 180, [Description("6+ months")] Long = 360 } 

是否有一种很好的方法创建一个可以执行EnumPrevious(TimeframeType.Short)返回TimeframeType.Now和EnumNext(TimeframeType.Short)的函数返回TimeframeType.Medium的函数?

我已经写了一个丑陋的EnumNext实现,但我不相信这是最好的方法。 我希望其他人已经解决了这个问题。

 public static T EnumNext(T value) where T : struct { T[] values = (T[])Enum.GetValues(typeof(T)); int i; for (i = 0; i = values.Length - 1) { return values[values.Length - 1]; } else { return values[i + 1]; } } 

你正试图解决错误的问题。 这对于简单的枚举来说太复杂了。 将枚举重构为类并使用比较接口。

如果这条路线对您开放,请查看如何通过类实现:

 public class TimeFrame: IComparable { private int days; public int Days { set { days = value; } } public int CompareTo(object other) { //see this for implementation -- http://msdn.microsoft.com/en-us/library/system.icomparable.aspx#Mtps_DropDownFilterText } public string Description { get code to return the description string , ie "1-3 months" } } 

.NET中的枚举并不是真正意义上的,所以你不应该依赖它。 之后的其他人可能只会在中间某处添加一个值不正常的值。 因此,内置的function也没有。您可以编写自己的function(类似于您已编写的function),但这完全取决于您。 我还想让你自己在你的方法中进行排序,而不是依靠.NET来保持项目“排序”。

补充:那,我还认为你应该选择另一种数据结构。

据我所知,没有内置的方法来做到这一点,你的解决方案看起来只是花花公子 – 假设枚举是正确的构造在这里使用…

我确实认为你试图用枚举做一点点。 或许TimeframeType应该是一个类,还是应该有一个静态的Timeframe数据数组?

(刚看到吉米的post – 看起来我们有类似的意见)。

有关Ada所做的事情的信息,请参阅像Ena in Ada这样的C ++中的Enum问题 – 尽管在那里的评论中写了什么,我认为在C,C ++和(我认为)中提供相同的function并不是微不足道的。 C#或Java,除非这些系统自动提供帮助。

请注意,这只有在您不关心枚举的值并且只是想要它们的顺序时才有效

如果您可以更改枚举,我会执行以下操作

 public enum TimeframeType { None = 0, [Description("1 month")] TimeFrameStep = 30, [Description("Step from previous to next")] Now = None + TimeFrameStep, [Description("1-3 months")] Short = Now + TimeFrameStep, [Description("3-6 months")] Medium = Now + TimeFrameStep, [Description("6+ months")] Long = Medium + TimeFrameStep, [Description("12 months")] } 

然后我将通过TimeFrameStep递增增量器从Now到Long循环。