2009-10-21 10 views
8

एनम टू की, वैल्यू जोड़े को कैसे परिवर्तित करें। मैंने इसे सी # 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); 

में सी # 1.0 तरह से ऐसा करने के लिए क्या है?

उत्तर

5

सी # 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 का उपयोग करें?

string[] trans = Enum.GetNames(typeof(Translation)); 

var v = trans.Select((value, key) => 
new { value, key }).ToDictionary(x => x.key + 1, x => x.value); 

क्योंकि यह गंदगी अपने प्रमुख (जो एक पूर्णांक है) होगा:

+0

धन्यवाद। बस मैंने स्कूली शिक्षा समाप्त की। Learnig सी # मैं आपकी सलाह श्रीमान का पालन करेंगे। – user193276

+0

अगर मैं अपना डिज़ाइन (कोडिंग स्टाइल) में सुधार करना चाहता हूं तो क्या मैं अपना काम सबमिट करूंगा और राय मांगूंगा या केवल इस मंच में सरल क्यू और ए की अनुमति होगी? – user193276

+0

अच्छा, विशिष्ट प्रश्न और उत्तर आदर्श हैं - लेकिन डिज़ाइन, स्पष्टता इत्यादि के मामले में कोड के * छोटे * टुकड़े से संबंधित प्रश्न ठीक हैं। बस एक प्रश्न में कोड की हजारों लाइनें सबमिट न करें :) यह एक बड़ी परियोजना का हिस्सा होने के बजाय, आपके उदाहरण छोटे और पूर्ण होने पर भी मदद करता है। –

16

सी # 3.0 के लिए अगर आप इस तरह की एक Enum है:

public enum Translation 
{ 
    English = 1, 
    Russian = 2, 
    French = 4, 
    German = 5 
} 

इस प्रयोग नहीं करते।

इसके बजाय, कुछ इस तरह का उपयोग करें:

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 मानों के साथ enums का समर्थन नहीं करता – Arch

+0

बहुत बहुत धन्यवाद! यह वास्तव में मैं क्या देख रहा था। मैं वास्तविक परियोजना में शब्दकोश <> डेटाटाइप के उपयोग को समझ नहीं पाया। – Tchaps

-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

मैं सवाल ध्यान से पढ़ें नहीं किया, इसलिए मेरी कोड सी # 1.0 में काम नहीं करेगा के रूप में यह जेनरिक इस्तेमाल करता है। इसका सबसे अच्छा उपयोग> = सी # 4.0 (> = वीएस -2010)

जीवन को आसान बनाने के लिए, मैंने यह सहायक सेवा बनाई है।

सेवा के लिए उपयोग इस प्रकार है: द्वारा @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

प्रश्न विशेष रूप से सी # 1.0 उत्तरों के लिए पूछता है, आप संस्करण 2.0 (जेनेरिक) और 3.0 ('var') सुविधाओं का उपयोग करते हैं? –

+0

मेरा बुरा, उसे नहीं देखा। –

0

उधार एक स्थिर में: इस प्रकार

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

सेवा कोड है विस्तार वर्ग फिर 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(); 
    } 
संबंधित मुद्दे