2009-10-21 197 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(); 
    }