Обычно я могу адресовать каждый элемент в перечислении по его упорядоченной позиции (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 }
В С# Вы можете использовать Enum.GetValues()
.
Он извлекает массив значений констант в указанной нумерации. Элементы массива сортируются по двоичным значениям констант перечисления.
Array enumElementsInArray = Enum.GetValues(typeof(WaitTime));
int firstElement = enumElementsInArray[0];
int secondElement = enumElementsInArray[1];
Но знайте, что он вернет aray после сортировки элементов по их значениям. Но, конечно, для вашего перечисления он будет работать так, как вы хотите.
Это будет общий способ, который работает для всех типов перечислений:
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
(Ответ для С#)
Нет, вы привыкли, например, _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: избегать указания подчеркивания при объявлении значений перечисления.