2009-01-10 31 views
4

給定一個已分配值的枚舉值,獲取下一個或前一個枚舉值的最佳方法是什麼?例如,考慮此枚舉:下一個或上一個枚舉

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

這是使用錯誤的工具進行工作的一個很好的例子 - 因此我的upvote。感謝您發佈一個好問題。 =) – 2009-01-10 00:41:15

回答

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" 
    } 

} 
+0

啊,這是一個更好的方法。這個類已經很長一段時間了,在添加新的功能時我試圖擴展而不是重構。感謝您的頭:) :) – DavGarcia 2009-01-10 01:49:18

2

枚舉在.NET是不是真的意味着排序,所以你不應該依賴在上面。其他人稍後可能會在中間的某個地方添加一個值,這將會失靈。因此,也沒有內置這樣的功能。您可以編寫自己的功能(類似於您已經編寫的功能),但完全取決於您。我也會建議你在自己的方法中進行排序,而不要依賴.NET來保持項目「排序」。

加:那,我也是第二個意見,你應該選擇另一個數據結構。

0

據我所知,有沒有內置的方式做到這一點,你的解決方案看起來只是花花公子 - 假設一個枚舉是在這裏使用權結構...

我認爲你正試圖通過枚舉來做很多事情。也許TimeframeType應該是一個類,或者應該有一個Timeframe數據的靜態數組?

(剛纔看到Jimmy的帖子 - 貌似我們有類似的意見)。

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遞增增量器,從現在到現在循環。

0

查看問題Enum in C++ like Enum in Ada瞭解Ada的功能 - 儘管在那裏寫了些什麼,但我認爲用C,C++或(我認爲)在C#中提供相同的功能並不重要,或者除非這些系統自動提供幫助。