下一个或上一个枚举

时间:2009-01-10 00:34:29

标签: c# enums

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

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];
    }
}

5 个答案:

答案 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中,除非这些系统自动提供帮助。