2010-02-18 7 views
105

tengo una enumeración:Busca una cadena en Enumeración y devolver el Enum

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

y tengo una cadena:

string colour = "Red"; 

Quiero ser capaz de volver:

MyColours.Red 

de:

public MyColours GetColour(string colour) 

hasta ahora tengo:

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

Como se puede ver, yo soy un poco atascado. ¿Hay alguna forma de seleccionar y enumerador por valor? Algo así como:

MyColour(2) 

daría lugar a

MyColour.Green 
+1

posible duplicado de [¿Cómo se convierte una cadena a una enumeración en C#?] (Http://stackoverflow.com/questions/16100/how-do-i-convert-a-string-to- an-enum-in-c) – nawfal

+3

@nawfal, no lo encontré cuando pregunté esto hace todos esos años. He votado para cerrar como duplicado. –

Respuesta

268

la salida System.Enum.Parse:

 

enum Colors {Red, Green, Blue} 

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

No olvide que puede hacer que ignore la distinción entre mayúsculas y minúsculas al pasar un tercer parámetro opcional para que sea "verdadero" – Aerophilic

+0

¡Exactamente lo que estaba buscando! ¡Salud! – Zame

+0

Es una pena que no haya Enum.TryParse ... – user1531040

15

puede convertir el int a una enumeración

(MyColour)2 

También existe la opción de Enum.Parse

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

Puedes usar Enum.Parse para obtener un valor enum del nombre. Puede repetir todos los valores con Enum.GetNames, y puede simplemente lanzar un int a una enumeración para obtener el valor enum del valor int.

Así, por ejemplo:

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 
} 

Este último lanzará una excepción ArgumentException si no se encuentra el valor, es posible que desee atraparlo dentro de la función y el retorno el valor predeterminado.

0

Como se mencionó en las respuestas anteriores, puede convertir directamente al tipo de datos subyacente (int -> tipo de enumeración) o analizar (cadena -> tipo de enumeración).

pero ten cuidado - no hay .TryParse para enumeraciones, por lo que necesitarás un bloque de prueba/captura alrededor del análisis para detectar fallas.

+1

No fue antes de que se hiciera esta pregunta, ¡pero ahora existe la de .NET 4! http://msdn.microsoft.com/en-us/library/system.enum.tryparse.aspx. Sería algo así como Enum.TryParse ("Rojo", fuera de color) – WienerDog

0

Es posible que también desee comprobar hacia fuera algunas de las sugerencias en esta entrada del blog: My new little friend, Enum<T>

El mensaje describe una manera de crear una muy simple clase de ayuda genérico que le permite evitar la sintaxis de fundición fea inherente a Enum.Parse - en vez terminas escribiendo algo como esto en su código:

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

O echa un vistazo a algunos de los comentarios en el mismo puesto que hablan sobre el uso de un método de extensión para lograr similar.

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# tiene una función incorporada para esto. – Artemix

+0

¿cómo es esta una respuesta a la pregunta? mira las otras respuestas para un código mucho más fácil – Firo

2

que marcó la respuesta de OregonGhost 1, entonces me trataron de utilizar la iteración y se dio cuenta que no era del todo bien porque Enum.GetNames devuelve cadenas. ¿Quieres 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 que podría ser útil para usted (además de las buenas respuestas ya válidos/proporcionadas hasta ahora) es la idea StringEnum proporcionado here

Con esto se puede definir sus enumeraciones como clases (los ejemplos son en vb.net):

< StringEnumRegisteredOnly(), DebuggerStepThrough(), ImmutableObject (True)> Pública NotInheritable Clase eAuthenticationMethod Heredar s StringEnumBase (De 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

Y ahora se puede utilizar la esta clase como lo haría con una enumeración: eAuthenticationMethod.WindowsAuthentication y esto sería esencialmente igual que la asignación de la 'W 'el valor lógico de WindowsAuthentication (dentro de la enumeración) y si tuviera que ver este valor desde una ventana de propiedades (u otra cosa que use la propiedad System.ComponentModel.Description) obtendría "Use Windows Authentication ".

He estado usando esto durante mucho tiempo y hace que el código sea más claro en su intento.

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