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