OrderBy на Enum.GetValues ​​()

Я заполняю DropDownList в MVC 4 из enum, и я хочу заказать значения перечисления от самого большого до наименьшего. Однако, похоже, нет прямого подхода к этому. В настоящее время я использую этот код для добавления в словарь с ключом, являющимся идентификатором, а значение - отображаемым текстом:

var priorities = Enum.GetValues(typeof(Models.Priority)).OfType<Models.Priority>().ToList();

for (int i = priorities.Count - 1; i >= 0; i--)
{
    Models.Priority priority = priorities[i];
    prioritiesDictionary.Add((int)priority, "Priority " + ((int)priority).ToString());
}

Я не верю, что внесение значений enum в список и обратный цикл назад является наиболее эффективным методом. В перечислении всего четыре значения, но есть ли лучший способ выполнить операцию OrderBy для того, что возвращается из Enum.GetValues? Я знаю, что это может быть минимальным эффектом, влияющим на то, как я это делаю, но я хочу знать для больших перечислений.

Ответ 1

Похоже, вы просто хотите:

var priorities = ((Models.Priority[]) Enum.GetValues(typeof(Models.Priority)))
                                          .OrderByDescending(x => x);

Или, чтобы избежать такого количества скобок:

var priorities = (Models.Priority[]) Enum.GetValues(typeof(Models.Priority));
var ordered = priorities.OrderByDescending(x => x);

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

Если вам нужен список, просто вызовите ToList() после вызова OrderByDescending.

Ответ 2

Как насчет этого:

Enum.GetValues(typeof(Models.Priority))
    .Cast<Models.Priority>()
    .OrderBy(x => (int) x)
    .ToList();

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

Ответ 3

Исходя из вышесказанного, я создаю функцию многократного использования...

    public static IOrderedEnumerable<TEnum> Sort<TEnum>()
    {
        return ((TEnum[]) Enum.GetValues(typeof (TEnum))).OrderBy(x => x.ToString());
    }