如何将Enum转换为Key,Value Pairs。我已将其转换为 C#3.0 。
public enum Translation
{
English,
Russian,
French,
German
}
string[] trans = Enum.GetNames(typeof(Translation));
var v = trans.Select((value, key) =>
new { value, key }).ToDictionary(x => x.key + 1, x => x.value);
在 C#1.0 中,这样做的方法是什么?
答案 0 :(得分:18)
对于C#3.0,如果你有这样的枚举:
public enum Translation
{
English = 1,
Russian = 2,
French = 4,
German = 5
}
不要使用此:
string[] trans = Enum.GetNames(typeof(Translation));
var v = trans.Select((value, key) =>
new { value, key }).ToDictionary(x => x.key + 1, x => x.value);
因为它会弄乱你的密钥(这是一个整数)。
相反,请使用以下内容:
var dict = new Dictionary<int, string>();
foreach (var name in Enum.GetNames(typeof(Translation)))
{
dict.Add((int)Enum.Parse(typeof(Translation), name), name);
}
答案 1 :(得分:5)
在C#1 ......
string[] names = Enum.GetNames(typeof(Translation));
Hashtable hashTable = new Hashtable();
for (int i = 0; i < names.Length; i++)
{
hashTable[i + 1] = names[i];
}
你确定你真的想要一个来自 index 的地图吗?如果您只是使用整数索引,为什么不使用数组或ArrayList
?
答案 2 :(得分:2)
我没有仔细阅读这个问题,所以我的代码在C#1.0中不起作用,因为它使用了泛型。最好使用&gt; = C#4.0(&gt; = VS2010)
为了让生活更轻松,我已经创建了这个帮助服务。
该服务的用法如下:
// create an instance of the service (or resolve it using DI)
var svc = new EnumHelperService();
// call the MapEnumToDictionary method (replace TestEnum1 with your enum)
var result = svc.MapEnumToDictionary<TestEnum1>();
服务代码如下:
/// <summary>
/// This service provides helper methods for enums.
/// </summary>
public interface IEnumHelperService
{
/// <summary>
/// Maps the enum to dictionary.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
Dictionary<int, string> MapEnumToDictionary<T>();
}
/// <summary>
/// This service provides helper methods for enums.
/// </summary>
/// <seealso cref="Panviva.Status.Probe.Lib.Services.IEnumHelperService" />
public class EnumHelperService : IEnumHelperService
{
/// <summary>
/// Initializes a new instance of the <see cref="EnumHelperService"/> class.
/// </summary>
public EnumHelperService()
{
}
/// <summary>
/// Maps the enum to dictionary.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
/// <exception cref="System.ArgumentException">T must be an enumerated type</exception>
public Dictionary<int, string> MapEnumToDictionary<T>()
{
// Ensure T is an enumerator
if (!typeof(T).IsEnum)
{
throw new ArgumentException("T must be an enumerator type.");
}
// Return Enumertator as a Dictionary
return Enum.GetValues(typeof(T)).Cast<T>().ToDictionary(i => (int)Convert.ChangeType(i, i.GetType()), t => t.ToString());
}
}
答案 3 :(得分:1)
借用@jamie的答案
将其放入静态扩展类中然后执行
typeof(Translation).ToValueList<int>();
/// <summary>
/// If an enum MyEnum is { a = 3, b = 5, c = 12 } then
/// typeof(MyEnum).ToValueList<<int>>() will return [3, 5, 12]
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="enumType"></param>
/// <returns>List of values defined for enum constants</returns>
public static List<T> ToValueList<T>(this Type enumType)
{
return Enum.GetNames(enumType)
.Select(x => (T)Enum.Parse(enumType, x))
.ToList();
}
答案 4 :(得分:1)
Enum.GetValues(typeof(DirectionEnum))。Cast()。Select(p => new {id = p,name =((DirectionEnum)p).ToString()})。ToList();
答案 5 :(得分:-1)
var enumType = typeof(Translation);
var objList = enumValuesList.Select(v =>
{
var i = (Translation)Enum.Parse(enumType, v);
return new
{
Id = (int)i,
Value = v
};
});