枚举到字典c#

我有网上search,但无法find我正在寻找的答案。 基本上我有以下枚举:

public enum typFoo : int { itemA : 1, itemB : 2 itemC : 3 } 

如何将此枚举转换为字典,以便它存储在下面的字典中

 Dictionary<int,string> mydic = new Dictionary<int,string>(); 

和mydic看起来像这样:

 1, itemA 2, itemB 3, itemC 

有任何想法吗?

请参阅: 如何枚举枚举?

 foreach( typFoo foo in Enum.GetValues(typeof(typFoo)) ) { mydic.Add((int)foo, foo.ToString()); } 

尝试:

 var dict = Enum.GetValues(typeof(typFoo)) .Cast<typFoo>() .ToDictionary(t => (int)t, t => t.ToString() ); 

调整Ani的答案,以便它可以作为一个通用的方法(谢谢, Toddmo ):

 public static Dictionary<int, string> EnumDictionary<T>() { if (!typeof(T).IsEnum) throw new ArgumentException("Type must be an enum"); return Enum.GetValues(typeof(T)) .Cast<T>() .ToDictionary(t => (int)(object)t, t => t.ToString()); } 

你可以枚举枚举描述符:

 Dictionary<int, string> enumDictionary = new Dictionary<int, string>(); foreach(var name in Enum.GetNames(typeof(typFoo)) { enumDictionary.Add((int)((typFoo)Enum.Parse(typeof(typFoo)), name), name); } 

这应该把每个项目的价值和名字放到你的字典中。

 public static class EnumHelper { public static IDictionary<int, string> ConvertToDictionary<T>() where T : struct { var dictionary = new Dictionary<int, string>(); var values = Enum.GetValues(typeof(T)); foreach (var value in values) { int key = (int) value; dictionary.Add(key, value.ToString()); } return dictionary; } } 

用法:

 public enum typFoo : int { itemA = 1, itemB = 2, itemC = 3 } var mydic = EnumHelper.ConvertToDictionary<typFoo>(); 
  • 扩展方法
  • 传统的命名
  • 一条线
  • c#7返回语法(但你可以在那些旧版本的c#中使用括号)
  • 如果types不是System.Enum ,则会引发ArgumentException ,这要归功于Enum.GetValues
  • 智能感知将被限制在结构中(没有enum约束可用)
  • 允许您使用枚举索引到字典中,如果需要的话。
 public static Dictionary<T, string> ToDictionary<T>() where T : struct => Enum.GetValues(typeof(T)).Cast<T>().ToDictionary(e => e, e => e.ToString()); 

+1给Ani 。 这是VB.NET版本

这里是Ani答案的VB.NET版本:

 Public Enum typFoo itemA = 1 itemB = 2 itemC = 3 End Enum Sub example() Dim dict As Dictionary(Of Integer, String) = System.Enum.GetValues(GetType(typFoo)) _ .Cast(Of typFoo)() _ .ToDictionary(Function(t) Integer.Parse(t), Function(t) t.ToString()) For Each i As KeyValuePair(Of Integer, String) In dict MsgBox(String.Format("Key: {0}, Value: {1}", i.Key, i.Value)) Next End Sub 

另外的例子

在我的情况下,我想保存重要目录的path,并将其存储在我的web.config的AppSettings部分。 然后我创build了一个枚举来表示这些AppSettings的关键字,但是我的前端工程师需要访问这些位置的外部JavaScript文件。 所以,我创build了以下代码块并将其放置在我们的主要母版页中。 现在,每个新的枚举项目将自动创build一个相应的JavaScriptvariables。 这是我的代码块:

  <script type="text/javascript"> var rootDirectory = '<%= ResolveUrl("~/")%>'; // This next part will loop through the public enumeration of App_Directory and create a corresponding javascript variable that contains the directory URL from the web.config. <% Dim App_Directories As Dictionary(Of String, App_Directory) = System.Enum.GetValues(GetType(App_Directory)) _ .Cast(Of App_Directory)() _ .ToDictionary(Of String)(Function(dir) dir.ToString)%> <% For Each i As KeyValuePair(Of String, App_Directory) In App_Directories%> <% Response.Write(String.Format("var {0} = '{1}';", i.Key, ResolveUrl(ConfigurationManager.AppSettings(i.Value))))%> <% next i %> </script> 

注意:在这个例子中,我使用枚举的名称作为键(而不是int值)。

使用reflection:

 Dictionary<int,string> mydic = new Dictionary<int,string>(); foreach (FieldInfo fi in typeof(typFoo).GetFields(BindingFlags.Public | BindingFlags.Static)) { mydic.Add(fi.GetRawConstantValue(), fi.Name); } 

如果你只需要这个名字,你根本不需要创build这个字典。

这会将enum转换为int:

  int pos = (int)typFoo.itemA; 

这将int转换为枚举:

  typFoo foo = (typFoo) 1; 

这会让你想起它的名字:

  ((typFoo) i).toString();