2010-02-18 15 views
105

Ho un'enumerazione:Cerca una stringa nella Enum e restituire l'Enum

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

e ho una stringa:

string colour = "Red"; 

Voglio essere in grado di tornare:

MyColours.Red 

da:

public MyColours GetColour(string colour) 

Finora ho:

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? 
} 

Come potete vedere, io sono un po 'bloccato. È comunque necessario selezionare ed enumerare in base al valore. Qualcosa di simile:

MyColour(2) 

si tradurrebbe in

MyColour.Green 
+1

possibile duplicato di [Come convertire una stringa in enum in C#?] (Http://stackoverflow.com/questions/16100/how-do-i-convert-a-string-to- an-enum-in-c) – nawfal

+3

@nawfal, non l'ho trovato quando gliel'ho chiesto tutti quegli anni fa. Hanno votato per chiudere come duplicato. –

risposta

268

check out System.Enum.Parse:

 

enum Colors {Red, Green, Blue} 

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

Non dimenticare che puoi ignorare la distinzione tra maiuscole e minuscole passando un terzo parametro opzionale per essere "vero" – Aerophilic

+0

Esattamente quello che stavo cercando! Saluti ! – Zame

+0

È un peccato che non ci sia Enum.TryParse ... – user1531040

15

si può lanciare l'int ad un enum

(MyColour)2 

C'è anche la possibilità di Enum.Parse

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

È possibile utilizzare Enum.Parse per ottenere un valore enum dal nome. È possibile eseguire l'iterazione su tutti i valori con Enum.GetNames ed è possibile eseguire il cast di un int su un enum per ottenere il valore enum dal valore int.

In questo modo, ad esempio:

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 
} 

o:

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

Quest'ultima lancerà un ArgumentException se il valore non viene trovato, si consiglia di prenderlo all'interno della funzione e il ritorno il valore predefinito.

0

Come accennato nelle risposte precedenti, si può lanciare direttamente al tipo di dati di base (int -> tipo enum) o analizzare (stringa -> tipo enum).

ma attenzione: non c'è. TryParse per enumerazione, quindi avrai bisogno di un blocco try/catch per analizzare i fallimenti.

+1

Non era prima che venisse posta questa domanda, ma ora c'è come da .NET 4! http://msdn.microsoft.com/en-us/library/system.enum.tryparse.aspx. Sarebbe qualcosa come Enum.TryParse ("Rosso", fuori colore) – WienerDog

0

Si potrebbe anche voler controllare alcuni dei suggerimenti in questo post del blog: My new little friend, Enum<T>

Il post descrive un modo per creare un semplice classe di supporto generico che consente di evitare la sintassi fusione brutto inerente con Enum.Parse - invece si finisce per scrivere qualcosa di simile nel codice:

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

O controllare alcuni dei commenti nello stesso posto che parlano di utilizzare un metodo di estensione per raggiungere simili.

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# ha funzionalità integrate per questo. – Artemix

+0

come è questa una risposta alla domanda? guarda le altre risposte per codice molto più semplice – Firo

2

ho segnato la risposta di OregonGhost +1, poi ho cercato di usare l'iterazione e si rese conto che non era giusto, perché Enum.GetNames ritorna stringhe. Si vuole Enum.GetValues:

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

    return MyColors.Default; 
} 
0

Una cosa che potrebbe essere utile a voi (oltre ai/buone risposte già fornite valide finora) è l'idea StringEnum fornito here

Con questo è possibile definire le enumerazioni come classi (gli esempi sono in vb.net):

< StringEnumRegisteredOnly(), DebuggerStepThrough(), ImmutableObject (true)> Public NotInheritable Classe eAuthenticationMethod Eredita s StringEnumBase (Of 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") 

End Class

E ora è possibile utilizzare il questa classe come si usa un enum: eAuthenticationMethod.WindowsAuthentication e questo sarebbe essenzialmente come l'assegnazione del 'W 'il valore logico di WindowsAuthentication (all'interno dell'enumerazione) e se si dovesse visualizzare questo valore da una finestra delle proprietà (o qualcos'altro che utilizza la proprietà System.ComponentModel.Description) si otterrebbe "Usa l'autenticazione di Windows ".

Lo uso da molto tempo e rende il codice più chiaro nell'intento.

0
(MyColours)Enum.Parse(typeof(MyColours), "red", true); // MyColours.Red 
(int)((MyColours)Enum.Parse(typeof(MyColours), "red", true)); // 0 
Problemi correlati