OrderBy on Enum.GetValues()

Cam*_*ker 14 c# linq enums

我正在填充一个DropDownListMVC 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());
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 24

听起来你只是想要:

var priorities = ((Models.Priority[]) Enum.GetValues(typeof(Models.Priority)))
                                          .OrderByDescending(x => x);
Run Code Online (Sandbox Code Playgroud)

或者避免使用相同数量的括号:

var priorities = (Models.Priority[]) Enum.GetValues(typeof(Models.Priority));
var ordered = priorities.OrderByDescending(x => x);
Run Code Online (Sandbox Code Playgroud)

通过给你一本字典,目前尚不清楚你当前的代码是如何帮助你的 - 但上面肯定会给你一系列枚举值,从最高到最低排序.您不需要转换为int,因为相同类型的枚举值已经相互比较.

如果您需要一个列表,请ToList()在通话后OrderByDescending拨打电话.


usr*_*usr 13

那这个呢:

Enum.GetValues(typeof(Models.Priority))
    .Cast<Models.Priority>()
    .OrderBy(x => (int) x)
    .ToList();
Run Code Online (Sandbox Code Playgroud)

不要使用,OfType因为它会默默地丢弃不匹配的项目.这几乎总是一个错误.

  • 是的,它会在这里产生相同的结果,但如果由于某种原因你犯了一个错误,那么你会想要一个错误而不是静默的数据损坏.通过告知开发人员他犯了错误来防范错误.(是的,OfType具有有效的用例......很少.) (2认同)