2017-10-06 160 views
0

以下代碼總是按enum的值排序,但我想按位置排列在enum之間。您注意到Matchupenum中排名第三,但值爲6.它總是作爲列表中的最後一次出現在迭代中。在枚舉中創建枚舉列表,並且不包含值

foreach (var enumName in Enum.GetValues(enumType).Cast<TEnum>()) 
      { 

} 

public enum RestrictionDetailType 
    { 
     [EnumMember(Value = "0"), Display(Name = "None")] 
     None = 0, 
     [EnumMember(Value = "1"), Display(Name = "Team")] 
     Team = 1, 
     [EnumMember(Value = "6"), Display(Name = "Matchup")] 
     Matchup = 6, 
     [EnumMember(Value = "2"), Display(Name = "Date/Time")] 
     DateTime = 2, 
     [EnumMember(Value = "3"), Display(Name = "Venue")] 
     VenueCourt = 3, 
     [EnumMember(Value = "4"), Display(Name = "Games")] 
     Games = 4, 
     [EnumMember(Value = "5"), Display(Name = "Exhibition")] 
     Exhibition = 5 
    } 
+1

你可以做任何順序它們的數組列表,你想和使用相反。 – juharr

+1

或者,在枚舉中創建一個新的屬性來存儲顯示順序和順序。 –

+2

@DiskJunky - 呃? ['GetValues()'](https://msdn.microsoft.com/en-us/library/system.enum.getvalues(v = vs.110).aspx)被記錄爲返回它們的順序「由其無符號的大小「 –

回答

2
foreach(FieldInfo fi in typeof(RestrictionDetailType).GetFields() 
    .Where(fi => fi.IsStatic).OrderBy(fi => fi.MetadataToken)) 
    Console.WriteLine(fi.Name); 

來源:Sort enums in declaration order

+0

這可能有用 - 但我不認爲這是有保證的。我認爲C#編譯器不保證賦予元數據標記的順序 –

0

你可以寫你自己的方法,這樣的:

public static List<T> GetEnumValuesInDeclarationOrder<T>() 
{ 
    var t = typeof(T); 
    // first type in this array is the data-type of the enum, int32 if not defined 
    var members = t.GetFields(); 

    var result = new List<T>(members.Length - 1); 
    foreach (FieldInfo mem in members.Skip(1)) 
     result.Add((T)mem.GetValue(null)); 

    return result; 
} 
+1

['GetFields'](https://msdn.microsoft.com/en-us/library/ch9714z3(v = vs.110).aspx ):「GetFields方法不會以特定的順序返回字段,例如字母順序或聲明順序。您的代碼不得依賴於返回字段的順序,因爲順序會有所不同。」 –

+0

@Damien_The_Unbeliever你說得對。我的錯。然後我認爲唯一的方法是將另一個自定義屬性添加到枚舉值並通過此自定義屬性值進行排序。 – Michael