2009-10-21 122 views
8

如何将枚举转换为键,值对。我已将其转换为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什么是这样做的方式吗?

回答

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]; 
} 

你确定你真的想要一个地图从指数来命名,但?如果你只是使用整数索引,为什么不使用数组或者ArrayList

+0

Thanks.Just I finished school.Learnig C#.I will follow your advice sir。 – user193276 2009-10-21 08:25:35

+0

如果我想改进我的设计(编码风格),我是否应该提交我的作品并征求意见,或者只能在本论坛中简单回答问题? – user193276 2009-10-21 08:28:04

+0

那么,具体的问题和答案是理想的 - 但在设计,清晰度等方面与* small *代码相关的问题都很好。只是不要在一个问题中提交数千行代码:)如果您的示例很短并且完整,而不仅仅是一个大项目的一部分,它也会有所帮助。 – 2009-10-21 09:57:26

16

对于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); 
} 
+0

被警告,在第二个例子中(如果它没有使用索引,我猜也是第一个)它不支持具有重复int值的枚举 – Arch 2013-08-30 20:22:59

+0

非常感谢!这真的是我正在寻找的。我无法理解在实际项目中使用Dictionary <>数据类型的情况。 – Tchaps 2015-06-18 15:36:24

-1
var enumType = typeof(Translation); 
var objList = enumValuesList.Select(v => 
{ 
    var i = (Translation)Enum.Parse(enumType, v); 
    return new 
    { 
     Id = (int)i, 
     Value = v 
    }; 
}); 
0

我没仔细看的问题,所以它使用泛型我的代码将无法正常工作在C#1.0。最好使用> = C#4.0(> = 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>(); 

服务代码如下:从答案通过@jamie

将这个

/// <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()); 
    } 
} 
+0

问题特别要求C#1.0的答案,您使用2.0版(泛型)和3.0('var')特性? – 2017-01-06 04:44:08

+0

我的不好,没有看到。 – 2017-01-06 04:59:18

0

借款为静态扩展类然后做 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(); 
    }