Адреса пользовательских значений перечисления по порядку

1

Обычно я могу адресовать каждый элемент в перечислении по его упорядоченной позиции (0, 1, 2, 3...), но если я создал перечисление с пользовательскими значениями (как показано ниже), есть ли еще способ адресовать каждый по его заявленному заказу (например, Off= 0, _5m= 1, _15m= 2 и т.д.), а не его значение?

enum WaitTime { Off = 0, _5m = 5, _15m = 15, _30m = 30, _1h = 60, _2h = 120, _3h = 180, _6h = 360, _12h = 720, _1d = 1440, _2d = 2880 }
Теги:
enums

3 ответа

2
Лучший ответ

В С# Вы можете использовать Enum.GetValues().

Он извлекает массив значений констант в указанной нумерации. Элементы массива сортируются по двоичным значениям констант перечисления.

Array enumElementsInArray = Enum.GetValues(typeof(WaitTime));

int firstElement = enumElementsInArray[0];
int secondElement = enumElementsInArray[1];

Но знайте, что он вернет aray после сортировки элементов по их значениям. Но, конечно, для вашего перечисления он будет работать так, как вы хотите.

  • 0
    Ах, похоже, это сработает, спасибо @Farhad! :)
  • 1
    @ Essential Рад, что это помогло. Но знайте, что он вернет массив после сортировки элементов по их значениям.
1

Это будет общий способ, который работает для всех типов перечислений:

public static T GetValueAt<T>(int idx)
{
  var vals = Enum.GetValues(typeof(T));
  return (T)vals.GetValue(idx);
}

Применение:

var value = GetValueAt<WaitTime>(2); //returns _15m
0

(Ответ для С#)

Нет, вы привыкли, например, _5m преобразуется в 5, а не в 1.

То, что вы называете "заказ", является неявным преобразованием в целое число (которое по умолчанию равно 0... N-1 для перечисления с N значениями)

enum WaitTime { Off = 0, _5m = 5, _15m = 15, _30m = 30, _1h = 60, _2h = 120, _3h = 180, _6h = 360, _12h = 720, _1d = 1440, _2d = 2880 }

class Program
{
    static void Main()
    {
        WaitTime wt = WaitTime._15m;
        Console.WriteLine((int)wt);
    }
}

Выйдет 15.

PS: избегать указания подчеркивания при объявлении значений перечисления.

  • 0
    Просто любопытно, почему я должен избегать подчеркивания (я думаю, вы имеете в виду лидерство?)? Я не могу начать перечисление имен с числа, поэтому подчеркивание.
  • 1
    Да, ведущий, с ошибкой ... Я бы сказал Wait5m, Wait30m или, возможно, использовать класс, инкапсулирующий TimeSpan и логическое значение On / Off

Ещё вопросы

Сообщество Overcoder
Наверх
Меню