Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Enum.GetValues()上的OrderBy_C#_Linq_Enums - Fatal编程技术网

C# Enum.GetValues()上的OrderBy

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-

我正在MVC4中从一个
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有有效的用例……只是很少有。)