C# Enum.GetValues()上的OrderBy
我正在MVC4中从一个C# Enum.GetValues()上的OrderBy,c#,linq,enums,C#,Linq,Enums,我正在MVC4中从一个enum填充一个DropDownList,我想将枚举值从最大到最小排序。然而,似乎没有一种直接的方法来解决这个问题。目前,我正在使用此代码添加到字典中,其中键是ID,值是显示文本: var priorities = Enum.GetValues(typeof(Models.Priority)).OfType<Models.Priority>().ToList(); for (int i = priorities.Count - 1; i >= 0; i-
enum
填充一个DropDownList
,我想将枚举值从最大到最小排序。然而,似乎没有一种直接的方法来解决这个问题。目前,我正在使用此代码添加到字典中,其中键是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());
}
var priorities=Enum.GetValues(typeof(Models.Priority)).OfType().ToList();
对于(int i=priorities.Count-1;i>=0;i--)
{
模型。优先级=优先级[i];
添加((int)priority,“priority”+((int)priority.ToString());
}
我不认为将枚举值放入列表并向后循环是最有效的方法。枚举中只有四个值,但是否有更好的方法对从
enum.GetValues
返回的内容执行OrderBy
操作?我知道以我这样做可能对性能影响最小,但我想知道更大的枚举。听起来你只是想:
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
,因为相同类型的枚举值已经可以相互比较
如果需要列表,只需在调用OrderByDescending
后调用ToList()
。这是怎么回事:
Enum.GetValues(typeof(Models.Priority))
.Cast<Models.Priority>()
.OrderBy(x => (int) x)
.ToList();
Enum.GetValues(typeof(Models.Priority))
.Cast()
.OrderBy(x=>(int)x)
.ToList();
不要使用类型为的
,因为这样会自动丢弃不匹配的项。这几乎总是一个错误。基于上述内容,我创建了一个可重用函数
public static IOrderedEnumerable<TEnum> Sort<TEnum>()
{
return ((TEnum[]) Enum.GetValues(typeof (TEnum))).OrderBy(x => x.ToString());
}
公共静态IORDerenumerable排序()
{
return((TEnum[])Enum.GetValues(typeof(TEnum)).OrderBy(x=>x.ToString());
}
用户订单是否按您已建议的方式降序?我认为您不应该关心性能,除非您的枚举包含数百个没有意义的值。通过使用LINQ查询,您可以简化代码并使其更具可读性。这就是为什么类型的对于某些类型的过滤器非常有用,但是我认为在这种情况下可以使用它,因为输入元素肯定是模型。优先级
是,它将在这里产生相同的结果,但是,如果出于某种原因您犯了错误,那么您需要的是错误,而不是无声的数据损坏。通过通知开发人员他犯了错误来防范bug。;(是的,OfType有有效的用例……只是很少有。)