枚举到字典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();