【问题标题】:C# Enum Indexing QuestionC# 枚举索引问题
【发布时间】:2011-09-20 19:31:58
【问题描述】:

是否可以使用索引整数来获取enum 值?例如,如果...

public enum Days { Mon, Tues, Wed, ..., Sun};

...有没有可能写出类似...的东西

Days currentDay = Days[index];

谢谢!

【问题讨论】:

标签: c# enums indexing


【解决方案1】:

不,但您可以将 int 转换为 enum,前提是您使用的值在 enum 中定义,但是这样做需要您自担风险:

Days currentDay = (Days)index;

如果你真的想要安全,你可以先检查它是否被定义,但这会涉及一些拳击等,并且会降低性能。

// checks to see if a const exists with the given value.
if (Enum.IsDefined(typeof(Days), index))
{
    currentDay = (Days)index;
}

如果您知道您的枚举是一个指定的连续值范围(即 Mon = 0 到 Sun = 6),您可以进行比较:

if (index >= (int)Days.Mon && index <= (int)Days.Sun)
{
    currentDay = (Days) index;
}

您也可以使用Enum.GetValues() 传回的数组,但这又比演员阵容重:

Day = (Day)Enum.GetValues(typeof(Day))[index];

【讨论】:

  • 谢谢詹姆斯。选项#3 是! :)
【解决方案2】:

如果你正确地索引你的枚举,你可以将 int(或任何索引)大小写到枚举。

所以...

public enum Days { Mon = 0, Tue, Wed .... }

Days today = (Days)1;    

【讨论】:

    【解决方案3】:

    之前我必须对DaysOfWeek 枚举进行一些计算。我使用了一种扩展方法来创建一个安全的默认值。

    这是一个例子:

    public enum Days { Invalid = ~0, Mon, Tues, Wed, Thurs, Fri, Sat, Sun };
    class Program
    {
        static void Main(string[] args)
        {
            int day = 8;
            Days day8 = (Days)day;
            Console.WriteLine("The eighth day is {0}", day8);
    
            Console.WriteLine("Days contains {0}: {1}", 
                day, Enum.IsDefined(typeof(Days), day));
    
            Console.WriteLine("Invalid day if {0} doesn't exist: {1}", 
                day, day8.OrDefault(Days.Invalid) );
    
            Console.WriteLine("Sunday day if {0} doesn't exist: {1}", 
                day, day8.OrDefault(Days.Sun));
    
            Days day9 = ((Days)9).OrDefault(Days.Wed);
            Console.WriteLine("Day (9) defaulted: {1}", 9, day9);
    
            Console.ReadLine();
        }
    }
    public static class DaysExtensions
    {
        public static Days OrDefault(this Days d, Days defaultDay) 
        {
            if (Enum.IsDefined(typeof(Days), (Days)d))
            {
                return d;
            }
    
            return defaultDay;
        }
    }
    

    还有输出:

    The eighth day is 8
    Days contains 8: False
    Invalid day if 8 doesn't exist: Invalid
    Sunday day if 8 doesn't exist: Sun
    Day (9) defaulted: Wed
    

    【讨论】:

    • 请不要将此标记为已接受的答案。我只是想分享一个其他人可能会觉得有帮助的替代解决方案。
    猜你喜欢
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多