2009-07-27 4 views
32

मैं एक कॉम्बो बॉक्स है, जहां मैं जैसे कुछ प्रविष्टियों को प्रदर्शित कर रहा हूँ है। मेरे पास एक एनम परिभाषित है जो इन प्रविष्टियों से मेल खाता है:स्ट्रिंग

enum Operation{Equals, Not_Equals, Less_Than, Greater_Than}; 

चूंकि अंतरिक्ष की अनुमति नहीं है, मैंने _ वर्ण का उपयोग किया है।

अब, क्या लूप लिखने के बिना दिए गए स्ट्रिंग को स्वचालित रूप से एक एनम तत्व में परिवर्तित करने का कोई तरीका है या सी # में मेरे स्वयं के परिस्थितियों का एक सेट है?

+0

दृढ़ता से संबंधित: [कैसे-टू-सेट-स्पेस-ऑन-एनम] (http://stackoverflow.com/questions/1101872/how-to-set-space-on-enum) – nawfal

+1

शब्दकोश के अतिरिक्त नीचे दृष्टिकोण, आप एक enum के साथ मेटाडेटा (जैसे प्रदर्शन तार) को जोड़ने के लिए विशेषताओं का उपयोग कर सकते हैं। देखें [सी # एनम्स के इन्स और आउट] (http://www.codeducky.org/ins-outs-c-enums/)। – ChaseMedallion

उत्तर

67

मैं सुझाव देता हूं कि Dictionary<string, Operation> को एनम स्थिरांक के अनुकूल नामों को मैप करने के लिए और तत्वों में सामान्य नामकरण सम्मेलनों का उपयोग करें।

enum Operation{ Equals, NotEquals, LessThan, GreaterThan }; 

var dict = new Dictionary<string, Operation> { 
    { "Equals", Operation.Equals }, 
    { "Not Equals", Operation.NotEquals }, 
    { "Less Than", Operation.LessThan }, 
    { "Greater Than", Operation.GreaterThan } 
}; 

var op = dict[str]; 

वैकल्पिक रूप से, अगर आप अपने वर्तमान पद्धति से चिपके करना चाहते हैं, तो आप (जो मैं करने की सलाह देते) कर सकते हैं:

var op = (Operation)Enum.Parse(typeof(Operation), str.Replace(' ', '_')); 
+1

ब्याज से, आप Enum.Parse का उपयोग करने के खिलाफ क्यों सलाह देते हैं? अधिक रूपांतरण? – Pondidum

+15

मैं 'Enum.Parse' विधि के खिलाफ नहीं हूं। मैं कोड तत्वों (और प्रदर्शन नामों के अनुसार कोड बदलना) को कसकर यूजर इंटरफेस तारों के साथ जोड़ रहा हूं। –

18

या तो एक समर्पित नक्शाकार एक शब्दकोश का उपयोग कर (Mehrdad के प्रति जवाब) बनाने या TypeConverter लागू करें।

आपका कस्टम टाइप कनवर्टर या तो " " -> "_" (और इसके विपरीत) को प्रतिस्थापित कर सकता है या यह गणना को प्रतिबिंबित कर सकता है और आइटम के प्रदर्शन टेक्स्ट को निर्धारित करने के लिए एक विशेषता का उपयोग कर सकता है।

enum Operation 
{ 
    [DisplayName("Equals")] 
    Equals, 

    [DisplayName("Not Equals")] 
    Not_Equals, 

    [DisplayName("Less Than")] 
    Less_Than, 

    [DisplayName("Greater Than")] 
    Greater_Than 
}; 

public class OperationTypeConverter : TypeConverter 
{ 
    private static Dictionary<string, Operation> operationMap; 

    static OperationTypeConverter() 
    { 
     BindingFlags bindingFlags = BindingFlags.Static | BindingFlags.GetField 
      | BindingFlags.Public; 

     operationMap = enumType.GetFields(bindingFlags).ToDictionary(
      c => GetDisplayName(c) 
      ); 
    } 

    private static string GetDisplayName(FieldInfo field, Type enumType) 
    { 
     DisplayNameAttribute attr = (DisplayNameAttribute)Attribute.GetCustomAttribute(typeof(DisplayNameAttribute)); 

     return (attr != null) ? attr.DisplayName : field.Name; 
    } 

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
    { 
     string stringValue = value as string; 

     if (stringValue != null) 
     { 
      Operation operation; 
      if (operationMap.TryGetValue(stringValue, out operation)) 
      { 
       return operation; 
      } 
      else 
      { 
       throw new ArgumentException("Cannot convert '" + stringValue + "' to Operation"); 
      } 
     } 
    } 
} 

इस कार्यान्वयन में कई तरह से सुधार किया जा सकता:

  • यह सामान्य
  • ConvertTo लागू
  • समर्थन FlagsAttribute
+0

कुछ याद आ रही है ... enumType कभी घोषित नहीं किया गया है, GetDisplayName एक पैरामीटर के साथ कॉल कर रहा है लेकिन 2 पैरामीटर घोषित किए गए हैं। –

+0

सुधार: स्थिर निर्माता –

+4

में enumType को कभी भी घोषित नहीं किया गया है, यह भी प्रकट नहीं होता है कि आप enum घोषणाओं पर DisplayName विशेषता का उपयोग कर सकते हैं –

19
Operation enumVal = (Operation)Enum.Parse(typeof(Operation), "Equals") 

"बराबर नहीं" के लिए है, आप ओबीवी आर करने की जरूरत है ऊपर बयान में अंडरस्कोर से eplace रिक्त स्थान

संपादित करें:

Operarion operation = (Operation)Enum.Parse(typeof(Operation), "Not_Equals"); 

कुछ उदाहरण:

string someInputText; 
var operation = (Operation)Enum.Parse(typeof(Operation), someInputText.Replace(" ", "_")); 
+0

वह ऑपरेशन के लिए "बराबर नहीं" से मेल नहीं खाएगा। नोट_इक्वाल्स –

+0

यही कारण है कि मैंने कहा है कि आपको अंडरस्कोर के साथ रिक्त स्थान बदलने के लिए मूल्य पर प्रतिस्थापन करने की आवश्यकता होगी ताकि यह मेल खा सके ... – AdaTheDev

9

आप पार्स विधि का उपयोग कर सकते हैं: निम्न संस्करण पार्स प्रयास करने से पहले अंडरस्कोर से रिक्त स्थान की जगह here

0

क्यों एक और तरीका का उपयोग करें: गणना को स्ट्रिंग में परिवर्तित करें?

बस अपने कॉम्बो बॉक्स के आइटम को अपने गणना से उत्पन्न करें।

0

सी # में, आप एनम प्रकारों में विस्तार विधियां जोड़ सकते हैं। http://msdn.microsoft.com/en-us/library/bb383974.aspx

आप अपने enum प्रकार के toString (ऑपरेशन सेशन), fromString (स्ट्रिंग str) और toLocalizedString (ऑपरेशन सेशन) विधियों को जोड़ने के लिए इस दृष्टिकोण का उपयोग कर सकते देखें।विशेष स्ट्रिंग को देखने के लिए आप जिस विधि का उपयोग करते हैं वह आपके आवेदन पर निर्भर करता है और आप इसी तरह के मामलों में जो भी करते हैं उसके अनुरूप होना चाहिए। एक शब्दकोश का उपयोग करना जैसा कि दूसरों ने सुझाव दिया है, तब तक एक अच्छा पहला दृष्टिकोण जैसा लगता है जब तक आपको अपने ऐप में पूर्ण स्थानीयकरण की आवश्यकता न हो।

0

मैं इस enum mapper class के सिंगलटन का उपयोग करता हूं जो Enum.Parse (जो प्रतिबिंब का उपयोग करता है और वास्तव में धीमा है) से बहुत तेज प्रदर्शन करता है। फिर आप अपना enum प्राप्त करने के लिए EnumFromString(typeof(YourEnum), "stringValue") का उपयोग कर सकते हैं।