C # Enum Indexing Question - PullRequest
       283

C # Enum Indexing Question

3 голосов
/ 20 сентября 2011

Можно ли использовать индексное целое число для получения значения enum?Например, если ...

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

... можно ли как-то написать что-то вроде ...

Days currentDay = Days[index];

Спасибо!

Ответы [ 3 ]

6 голосов
/ 20 сентября 2011

Нет, но вы можете привести 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;
}

Если вы знаете, что ваше перечисление является заданным непрерывным значениемдиапазон (т. е. пн = 0 по вс = 6) вы можете сравнить:

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

Вы также можете использовать массив, переданный обратно Enum.GetValues(), но, опять же, он тяжелее, чем приведение:

Day = (Day)Enum.GetValues(typeof(Day))[index];
0 голосов
/ 20 сентября 2011

Я должен был сделать некоторые вычисления с перечислением 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
0 голосов
/ 20 сентября 2011

Если вы правильно проиндексировали свои перечисления, вы можете просто вставить int (или любой другой индекс) в перечисление.

Итак ...

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

Days today = (Days)1;    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...