给定一个已赋值的枚举,获取给定值的下一个或前一个枚举的最佳方法是什么?例如,考虑下面的枚举:
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];
}
}发布于 2009-01-10 00:38:33
您正在尝试解决错误的问题。对于简单的枚举来说,这太复杂了。将枚举重构为一个类,并使用比较接口。
如果这个路径对你开放,看看这个类是如何实现的:
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"
}
}发布于 2009-01-10 00:39:10
.NET中的枚举实际上并不是用来排序的,所以你不应该依赖它。之后,其他人可能只是在中间的某个位置添加了一个值,这将是无序的。因此,也没有内置这样的功能。您可以编写自己的函数(类似于您已经编写的函数),但这完全取决于您。我也建议你在你的方法中自己进行排序,而不是依靠.NET来保持项目的“排序”。
补充道:,我也赞同你应该选择另一种数据结构的观点。
发布于 2009-01-10 00:42:30
据我所知,没有内置的方法来做到这一点,而且你的解决方案看起来很棒-假设枚举是这里使用的正确结构……
我确实认为您正在尝试使用枚举做更多的事情。也许TimeframeType应该是一个类,或者应该有一个静态的时间范围数据数组?
(刚刚看到了吉米的帖子-看起来我们有类似的观点)。
https://stackoverflow.com/questions/430264
复制相似问题