OrderBy on Enum.GetValues()

时间:2013-10-25 20:52:24

标签: c# linq enums

我正在从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操作吗?我知道这可能是影响我的方式影响很小,但我想知道更大的枚举。

3 个答案:

答案 0 :(得分:22)

听起来你只是想要:

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

答案 1 :(得分:13)

这个怎么样:

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

不要使用OfType,因为它会以静默方式丢弃不匹配的项目。这几乎总是一个错误。

答案 2 :(得分:3)

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

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