16

我正在DropDownList从一个填充 MVC 4 中的一个enum,并且我想将枚举值从最大到最小排序。但是,似乎没有直接的方法来解决这个问题。目前,我正在使用此代码添加到字典,其中键是 ID,值是显示文本:

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());
}

我不相信将枚举值放入列表并向后循环是最有效的方法。枚举中只有四个值,但是有没有更好的方法来OrderBy对从返回的内容执行操作Enum.GetValues?我知道以我的方式这样做可能对性能的影响最小,但我想知道更大的枚举。

4

4 回答 4

28

听起来你只是想要:

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致电。

于 2013-10-25T20:54:26.357 回答
15

那这个呢:

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

您不应该使用OfType<T>()这种逻辑风格,因为这会默默地丢弃不匹配的项目。在这种情况下,不匹配的项目将表示严重错误或误用。

如果期望所有项目都已经是某种类型,那么我们使用Cast<T>().

OfType<T>是一个过滤器操作,它旨在用于我们知道某些项目无法转换为预期类型的​​场景。OfType<T>因此在可能包含null有价值项目的列表中很有用。

OfType<T>通常用于对无类型或object枚举(如类型属性)进行操作的表达式,或者当枚举是基类型并且您只需要特定实现的对象或实现特定接口的对象时。

于 2013-10-25T20:54:31.913 回答
4

基于以上,我创建了一个可重用的函数......

    public static IOrderedEnumerable<TEnum> Sort<TEnum>()
    {
        return ((TEnum[]) Enum.GetValues(typeof (TEnum))).OrderBy(x => x.ToString());
    }
于 2015-11-20T20:09:10.950 回答
1

我喜欢声明一个可以像这样使用的枚举助手:

Enum<MyEnum>.ValuesAscending

这里是帮手

using System;
using System.Collections.Generic;
using System.Linq;
...
  public static class Enum<T>
    where T : struct, Enum
  {
    public static readonly IReadOnlyList<T> ValuesAscending = Enum.GetValues( typeof( T ) ).Cast<T>().Distinct().OrderBy( v => v ).ToList();
    public static readonly IReadOnlyList<T> ValuesDescending = Enum.GetValues( typeof( T ) ).Cast<T>().Distinct().OrderByDescending( v => v ).ToList();
    public static readonly IReadOnlyList<string> NamesAscending = Enum.GetNames( typeof( T ) ).OrderBy( s => s ).ToList();
    public static readonly IReadOnlyList<string> NamesDescending = Enum.GetNames( typeof( T ) ).OrderByDescending( s => s ).ToList();
  };

注意:ValuesAscending两者ValuesDescending都消除了重复,并且仍然可以使用除int. 这些列表也使用静态类的静态成员的魔力进行缓存,但如果您需要,我不能保证线程安全。

如果您想要更多帮助者,我在这里有更广泛的要点:https ://gist.github.com/cgbeutler/699e96f4868a7ccdd004d1daf38407d9

于 2022-01-03T01:30:49.910 回答