2012-03-07 15 views
5

मैच के लिए अगर मैं का एक enum है चार केपार्स स्ट्रिंग enum मूल्य

public enum Action 
{ 
    None, 
    Address = 'A', 
    Amendment = 'C', 
    Normal = 'N' 
} 

क्या सबसे अच्छा तरीका है एक भी चरित्र स्ट्रिंग इसी enum चार से मेल खाते हैं और कोई नहीं से मेल खाते हैं, तो नहीं मिला को पार्स करने के लिए है। TryParse नाम से मेल खाता है और मूल्य नहीं।

उदाहरण के लिए अगर स्ट्रिंग मैं थे "सी" मैं पहले से

धन्यवाद Action.Amendement प्राप्त करना चाहते हैं

+2

"मेरे पास चार का enum है" - नहीं आप नहीं करते :) आपके पास 'int' का एक enum है, जिसका मान वर्ण अक्षर का उपयोग करके निर्दिष्ट किया गया है। स्पष्टीकरण के लिए – porges

+0

@Porges धन्यवाद! – m4rc

उत्तर

5
char c = 'C'; // existent value 
var action = Enum.GetValues(typeof(Action)).Cast<Action>().FirstOrDefault(a => (char)a == c); 
// action = Action.Amendment 

और:

char c = 'X'; // non existent value 
var action = Enum.GetValues(typeof(Action)).Cast<Action>().FirstOrDefault(a => (char)a == c); 
// action = Action.None 
+0

शानदार! यह वैसे ही काम करता है जैसा मैं चाहता था। :-) धन्यवाद – m4rc

4

बस इसे डाली:

Action f = (Action)'C'; 

आप एक स्ट्रिंग था और सकारात्मक थे यह कम से कम 1 वर्ण था जो आप कर सकते हैं:

Action f = (Action)"C"[0]; 
+0

मुझे लगता है कि वह 'एक्शन' के साथ 'एक्शन' प्राप्त करना चाहता है उदाहरण के लिए क्योंकि 'एक्स' एनम के लिए वैध मान नहीं है। –

+0

@DarinDimitrov हाँ मैंने देखा कि। यही कारण है कि ffs यह क्लीनर तू यही कारण है कि मैं अपने जवाब –

+0

बढ़ा है, और और एक enum पार्स करने के लिए, हम 2003 के बाद से enums को पार्स किया गया है "हम LINQ की जरूरत नहीं है"! "OMG,। – b0rg

0

Enums पर्दे के पीछे सांख्यिक प्रकार हैं। आप सार्वजनिक तारों की एक कक्षा का प्रयास कर सकते हैं:

public class Action() 
{ 
    public const string A = "Address"; 
    public const string C = "Amendment"; 
} 

यदि आप इसे 2 तरीके करना चाहते हैं तो शायद आप 2 तरीके शब्दकोश संग्रह का उपयोग करना चाहते हैं।

3

मैं व्यक्तिगत रूप से उन्हें पूर्णांक के रूप में छोड़ने के लिए और प्रकार के लिए वर्णन attribue पाने के लिए DescriptionAttributes और एक उपयोगिता वर्ग का उपयोग करेंगे। फिर आप जो चाहते थे उसे प्रदर्शित करने के लिए केवल एक चरित्र से अधिक उपयोग कर सकते हैं।

इसका एक उदाहरण है;

/// <summary> 
    /// Returns the string value defined by the description attribute of the given enum. 
    /// If no description attribute is available, then it returns the string representation of the enum. 
    /// </summary> 
    /// <param name="value">Enum to use</param> 
    /// <returns>String representation of enum using Description attribute where possible</returns> 
    public static string StringValueOf(Enum value) 
    { 
     FieldInfo fi = value.GetType().GetField(value.ToString()); 
     DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); 
     if (attributes.Length > 0) 
     { 
      return attributes[0].Description; 
     } 
     else 
     { 
      return value.ToString(); 
     } 
    } 

जहां आपका enum कुछ जैसा परिभाषित किया गया है;

public enum Action 
{ 
    None, 
    [DescriptionAttribute("A")] 
    Address, 
    [DescriptionAttribute("C")] 
    Amendment, 
    [DescriptionAttribute("N")] 
    Normal 
} 
+0

धन्यवाद, मुझे विवरण एट्रिब्यूट्स के बारे में पता नहीं था। इससे मुझे मदद मिली (एक अलग समस्या के साथ लेकिन अभी भी ...) –

+0

@DanielGruszczyk - कोई जांच नहीं। आप विवरण एट्रिब्यूट्स तक सीमित नहीं हैं। कोई भी [कस्ट omAttribute] (http://msdn.microsoft.com/en-us/library/84c42s56.aspx) ऐसा करने के लिए उपयोग किया जा सकता है। हम इसे एक सिस्टम मानों के मानचित्रण के लिए मैपिंग करने के लिए उपयोग करते हैं (यानी एनम मान एक सिस्टम के लिए मान का प्रतिनिधित्व करता है, और हमारे पास अन्य सिस्टम, या बेहतर विवरण, या कुछ अन्य संबंधित जानकारी के लिए मैपिंग के लिए कई विवरण विशेषताओं हैं जो युग्मन की आवश्यकता है enum मूल्य के साथ)। –

संबंधित मुद्दे