[英]OrderBy on Enum.GetValues()
我正在從enum
填充 MVC 4 中的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());
}
我不相信將枚舉值放入列表並向后循環是最有效的方法。 枚舉中只有四個值,但是有沒有更好的方法來對從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();
不要使用OfType
因為它會以靜默方式拋棄不匹配的項目。 這幾乎總是一個錯誤。
基於以上所述,我創建了一個可重用的功能......
public static IOrderedEnumerable<TEnum> Sort<TEnum>()
{
return ((TEnum[]) Enum.GetValues(typeof (TEnum))).OrderBy(x => x.ToString());
}
我喜歡聲明一個可以像這樣使用的枚舉助手:
Enum<MyEnum>.ValuesAscending
這里是幫手
using System;
using System.Collections.Generic;
using System.Linq;
...
public static class Enum<T>
where T : struct, Enum
{
public static readonly IReadOnlyList<T> ValuesAscending = Enum.GetValues( typeof( T ) ).Cast<T>().Distinct().OrderBy( v => v ).ToList();
public static readonly IReadOnlyList<T> ValuesDescending = Enum.GetValues( typeof( T ) ).Cast<T>().Distinct().OrderByDescending( v => v ).ToList();
public static readonly IReadOnlyList<string> NamesAscending = Enum.GetNames( typeof( T ) ).OrderBy( s => s ).ToList();
public static readonly IReadOnlyList<string> NamesDescending = Enum.GetNames( typeof( T ) ).OrderByDescending( s => s ).ToList();
};
注意: ValuesAscending
和ValuesDescending
都消除了重復項,並且仍然適用於int
以外的枚舉類型。 列表也使用靜態類的靜態成員的魔法進行緩存,但如果您需要,我不能保證線程安全。
如果你想要更多的幫手,我這里有一個更廣泛的要點: https : //gist.github.com/cgbeutler/699e96f4868a7ccdd004d1daf38407d9
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.