簡體   English   中英

Enum.GetValues() 上的 OrderBy

[英]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();
  };

注意: ValuesAscendingValuesDescending都消除了重復項,並且仍然適用於int以外的枚舉類型。 列表也使用靜態類的靜態成員的魔法進行緩存,但如果您需要,我不能保證線程安全。

如果你想要更多的幫手,我這里有一個更廣泛的要點: https : //gist.github.com/cgbeutler/699e96f4868a7ccdd004d1daf38407d9

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM