Enum में एक स्ट्रिंग के लिए खोजें और Enum वापस करें


163

मेरे पास एक कल्पना है:

public enum MyColours
{
    Red,
    Green,
    Blue,
    Yellow,
    Fuchsia,
    Aqua,
    Orange
}

और मेरे पास एक तार है:

string colour = "Red";

मैं वापसी करने में सक्षम होना चाहता हूं:

MyColours.Red

से:

public MyColours GetColour(string colour)

अब तक मेरे पास है:

public MyColours GetColours(string colour)
{
    string[] colours = Enum.GetNames(typeof(MyColours));
    int[]    values  = Enum.GetValues(typeof(MyColours));
    int i;
    for(int i = 0; i < colours.Length; i++)
    {
        if(colour.Equals(colours[i], StringComparison.Ordinal)
            break;
    }
    int value = values[i];
    // I know all the information about the matched enumeration
    // but how do i convert this information into returning a
    // MyColour enumeration?
}

जैसा कि आप देख सकते हैं, मैं थोड़ा फंस गया हूं। वहाँ वैसे भी मूल्य द्वारा एक एन्यूमरेटर का चयन करना है। कुछ इस तरह:

MyColour(2) 

में परिणाम होगा

MyColour.Green


4
@nawfal, यह नहीं पाया कि जब मैंने उन सभी से वर्षों पहले पूछा था। डुप्लिकेट के रूप में बंद करने के लिए मतदान किया है।
मैट क्लार्कसन

जवाबों:


381

Check out System.Enum.Parse:


enum Colors {Red, Green, Blue}

// your code:
Colors color = (Colors)System.Enum.Parse(typeof(Colors), "Green");


72
मत भूलो कि आप इसे "सत्य" होने के लिए एक तीसरे वैकल्पिक पैरामीटर में पारित करके मामले की संवेदनशीलता को अनदेखा कर सकते हैं
एरोफिलिक

ठीक वही जो मेरे द्वारा खोजा जा रहा था ! चियर्स!
ज़ेम

11
@ user1531040 वास्तव में, एक Enum.TryParse है।
डार्लोम

ध्यान दें कि यदि इनपुट संख्यात्मक है, तो एनम पार्सिंग हमेशा 'सफल' होता है; यह केवल पार्स किए गए नंबर को लौटाता है, जो बाद में एनम के प्रकार पर आ जाता है। इसलिए यदि आप जांचना चाहते हैं कि क्या कुछ उपयोगकर्ता इनपुट वैध एनम या कुछ और है, तो आपको पहले संख्यात्मक सामग्री की जांच करनी चाहिए। चूँकि यह एक वैध एनम लौटाता है, लेकिन ऐसे मान के साथ जो परिभाषित एनम नामों में बिल्कुल भी मौजूद नहीं है, तो आपको कुछ वास्तव में अजीब समस्याएं मिल सकती हैं।
Nyerguds

19

आप एक एनम को इंटिमेट कर सकते हैं

(MyColour)2

Enum.Parse का विकल्प भी है

(MyColour)Enum.Parse(typeof(MyColour), "Red")

11

.NET (+ Core) और C # 7 के नवीनतम और सबसे बड़े परिवर्तनों को देखते हुए, यहां सबसे अच्छा समाधान है:

var ignoreCase = true;
Enum.TryParse("red", ignoreCase , out MyColours colour);

रंग चर का उपयोग Enum.TryParse के दायरे में किया जा सकता है



2

मैंने ओरेगॉनहोस्ट के उत्तर को +1 किया, तब मैंने पुनरावृत्ति का उपयोग करने की कोशिश की और महसूस किया कि यह काफी सही नहीं था क्योंकि Enum.GetNames ने तार लौटा दिए। आप Enum.GetValues ​​चाहते हैं:

public MyColours GetColours(string colour)
{  
   foreach (MyColours mc in Enum.GetValues(typeof(MyColours))) 
   if (mc.ToString() == surveySystem) 
      return mc;

   return MyColors.Default;
}

1

आप Enum.Parseनाम से एक Enum मान प्राप्त करने के लिए उपयोग कर सकते हैं । आप सभी मानों से अधिक पुनरावृति कर सकते हैं Enum.GetNames, और आप केवल एक एनुम को इंटम वैल्यू से एनुम मान प्राप्त करने के लिए एक कास्ट कर सकते हैं।

इस तरह, उदाहरण के लिए:

public MyColours GetColours(string colour)
{
    foreach (MyColours mc in Enum.GetNames(typeof(MyColours))) {
        if (mc.ToString().Contains(colour)) {
            return mc;
        }
    }
    return MyColours.Red; // Default value
}

या:

public MyColours GetColours(string colour)
{
    return (MyColours)Enum.Parse(typeof(MyColours), colour, true); // true = ignoreCase
}

उत्तरार्द्ध एक ArgumentException को फेंक देगा यदि मूल्य नहीं मिला है, तो आप इसे फ़ंक्शन के अंदर पकड़ना चाहते हैं और डिफ़ॉल्ट मान वापस कर सकते हैं।


नोट: यह Enum.GetValues ​​होना चाहिए, निश्चित रूप से, कॉलिन के उत्तर में दिखाया गया है।
ओरेगॉनहोस्ट जूल

1
var color =  Enum.Parse<Colors>("Green");

यह भी संकलन नहीं है। कोई सामान्य Parseविधि नहीं है।
जोहो मेन्जिनिन

यह मेरे लिए संकलित और काम करता है। शायद यह आपके द्वारा उपयोग किए जा रहे संस्करण पर निर्भर करता है? मैं .NET कोर 3.1 का उपयोग कर रहा हूं
विन्नी

0

जैसा कि पिछले जवाबों में बताया गया है, आप सीधे अंतर्निहित डेटाटाइप (int -> enum type) या parse (string -> enum type) पर कास्ट कर सकते हैं।

लेकिन सावधान रहना - वहाँ enums के लिए कोई .TryParse है, तो आप विफलताओं को पकड़ने के लिए पार्स के चारों ओर एक कोशिश / पकड़ ब्लॉक की आवश्यकता होगी।


3
यह सवाल पूछे जाने से पहले नहीं था, लेकिन अब .NET 4 है! msdn.microsoft.com/en-us/library/system.enum.tryparse.aspx । यह Enum.TryParse <MyColour> ("रेड", आउट कलर) जैसा कुछ होगा
WienerDog

0
class EnumStringToInt // to search for a string in enum
{
    enum Numbers{one,two,hree};
    static void Main()
    {
        Numbers num = Numbers.one; // converting enum to string
        string str = num.ToString();
        //Console.WriteLine(str);
        string str1 = "four";
        string[] getnames = (string[])Enum.GetNames(typeof(Numbers));
        int[] getnum = (int[])Enum.GetValues(typeof(Numbers));
        try
        {
            for (int i = 0; i <= getnum.Length; i++)
            {
                if (str1.Equals(getnames[i]))
                {
                    Numbers num1 = (Numbers)Enum.Parse(typeof(Numbers), str1);
                    Console.WriteLine("string found:{0}", num1);
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Value not found!", ex);
        }
    }
}

2
C # में इसके लिए अंतर्निहित कार्यक्षमता है।
आर्टेमिक्स

यह सवाल का जवाब कैसे है? बहुत आसान कोड के लिए अन्य उत्तरों को देखें
Firo

0

एक चीज जो आपके लिए उपयोगी हो सकती है (अब तक प्रदान किए गए पहले से मान्य / अच्छे उत्तरों के अलावा) StringEnum विचार यहां प्रदान किया गया है

इसके साथ आप अपनी गणनाओं को कक्षाओं के रूप में परिभाषित कर सकते हैं (उदाहरण vb.net में हैं):

<StringEnumRegisteredOnly (), DebuggerStepThrough (), ImmutableObject (True)> Public NotInheritable Class eAuthenticationMethod Inherits StringEmBase (eAuthenticationMethod का)

Private Sub New(ByVal StrValue As String)
  MyBase.New(StrValue)   
End Sub

< Description("Use User Password Authentication")> Public Shared ReadOnly UsernamePassword As New eAuthenticationMethod("UP")   

< Description("Use Windows Authentication")> Public Shared ReadOnly WindowsAuthentication As New eAuthenticationMethod("W")   

एंड क्लास

और अब आप के रूप में आप एक enum का प्रयोग करेंगे इस वर्ग इस्तेमाल कर सकते हैं: eAuthenticationMethod.WindowsAuthentication और इस अनिवार्य रूप से 'बताए जैसा होगा डब्ल्यू ' के तार्किक मान WindowsAuthentication (enum के अंदर) और यदि आप एक गुणों से इस मूल्य देखने के लिए थे विंडो (या कुछ और जो System.ComponentModel.Description property का उपयोग करता है) आपको " Use Windows Authentication " मिलेगा ।

मैं लंबे समय से इसका उपयोग कर रहा हूं और यह इरादे में कोड को अधिक स्पष्ट करता है।



-1

आप इस ब्लॉग पोस्ट में कुछ सुझावों की जांच करना चाहेंगे: मेरा नया छोटा दोस्त, एनम <टी>

पोस्ट एक बहुत ही सरल जेनेरिक हेल्पर क्लास बनाने का एक तरीका बताता है जो आपको बदसूरत कास्टिंग सिंटैक्स से बचने में सक्षम बनाता है Enum.Parse- इसके बजाय आप अपने कोड में इस तरह से कुछ लिखना समाप्त करते हैं:

MyColours colour = Enum<MyColours>.Parse(stringValue); 

या उसी पोस्ट में कुछ टिप्पणियों की जांच करें जो समान प्राप्त करने के लिए एक विस्तार विधि का उपयोग करने के बारे में बात करते हैं।


पोस्ट लिंक टूट गया है।
माचादो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.