给定已分配值的枚举,给出值的下一个或上一个枚举的最佳方法是什么。例如,考虑这个枚举:
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>(T value) where T : struct {
T[] values = (T[])Enum.GetValues(typeof(T));
int i;
for (i = 0; i < values.Length; i++) {
if (object.Equals(value, values[i])) {
break;
}
}
if (i >= values.Length - 1) {
return values[values.Length - 1];
} else {
return values[i + 1];
}
}
答案 0 :(得分:5)
你正试图解决错误的问题。这对于简单的枚举来说太复杂了。将枚举重构为类并使用比较接口。
如果这条路线是开放的,请查看一下这个 的实现方式:
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"
}
}
答案 1 :(得分:2)
.NET中的枚举并不是真正意义上的,所以你不应该依赖它。之后的其他人可能只会在中间某处添加一个值不正常的值。因此,内置的功能也没有。您可以编写自己的功能(类似于您已编写的功能),但这完全取决于您。我还想在你的方法中自己进行排序,而不是依靠.NET来保持项目“排序”。
已添加:那,我还认为您应该选择其他数据结构。
答案 2 :(得分:0)
据我所知,没有内置方法可以做到这一点,你的解决方案看起来只是花花公子 - 假设枚举是正确的构造在这里使用...
我确实认为你试图用枚举来做很多事情。或许TimeframeType应该是一个类,还是应该有一个静态的Timeframe数据数组?
(刚看到Jimmy的帖子 - 看起来我们有类似的意见)。
答案 3 :(得分:0)
请注意,只有在您不关心枚举的值并且只是想要它们的命令时才能使用
如果您可以更改枚举,我会执行以下操作
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。
答案 4 :(得分:0)
有关Ada所做的事情的信息,请参阅问题Enum in C++ like Enum in Ada - 尽管在那里的评论中写了什么,我认为在C,C ++和(我认为)中提供相同的功能并不是一件容易的事。在C#或Java中,除非这些系统自动提供帮助。