web-dev-qa-db-fra.com

Rechercher une chaîne dans Enum et retourner l'énum.

J'ai une énumération:

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

et j'ai une ficelle:

string colour = "Red";

Je veux pouvoir revenir:

MyColours.Red

de:

public MyColours GetColour(string colour)

Jusqu'ici j'ai:

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

Comme vous pouvez le constater, je suis un peu coincé. Est-il possible de sélectionner un énumérateur par valeur? Quelque chose comme:

MyColour(2) 

aboutirait à

MyColour.Green
132
Matt Clarkson

découvrez System.Enum.Parse:


enum Colors {Red, Green, Blue}

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

Vous pouvez jeter l'int en un enum

(MyColour)2

Il y a aussi l'option d'Enum.Parse

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

Compte tenu des dernières modifications majeures apportées à .NET (+ Core) et C # 7, voici la meilleure solution:

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

variable de couleur peut être utilisé dans le cadre de Enum.TryParse

7
Roman

Tout ce dont vous avez besoin est Enum.Parse

4
Bruno Brant

J'ai marqué la réponse +1 de OregonGhost, puis j'ai essayé d'utiliser l'itération et j'ai réalisé que ce n'était pas tout à fait correct car Enum.GetNames renvoie des chaînes. Vous voulez Enum.GetValues:

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

   return MyColors.Default;
}
2
Colin

Vous pouvez utiliser Enum.Parse pour obtenir une valeur enum à partir du nom. Vous pouvez parcourir toutes les valeurs avec Enum.GetNames et vous pouvez simplement convertir un int en une enum pour obtenir la valeur enum de la valeur int.

Comme ceci, par exemple:

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
}

ou:

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

Ce dernier lève une exception ArgumentException si la valeur n'est pas trouvée. Vous pouvez le récupérer dans la fonction et renvoyer la valeur par défaut.

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

Une chose qui pourrait vous être utile (à part les réponses déjà valides/bonnes fournies jusqu'à présent) est l'idée de StringEnum fournie ici

Avec cela, vous pouvez définir vos énumérations en tant que classes (les exemples sont en vb.net):

<StringEnumRegisteredOnly (), DebuggerStepThrough (), ImmutableObject (True)> Public NotInheritable Class eAuthenticationMethod Inherits 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")   

Classe de fin

Et vous pouvez maintenant utiliser la classe this comme vous utiliseriez une énumération: eAuthenticationMethod.WindowsAuthentication, ce qui revient essentiellement à attribuer à 'W' la valeur logique de WindowsAuthentication (dans l’énumération) Si vous deviez afficher cette valeur à partir d'une fenêtre de propriétés (ou de tout autre élément utilisant la propriété System.ComponentModel.Description), vous obtiendrez "Use Windows Authentication".

Je l'utilise depuis longtemps maintenant et cela clarifie l'intention du code.

0
Ando
var color =  Enum.Parse<Colors>("Green");
0
pampi

Vous pouvez également consulter certaines des suggestions de ce billet: Mon nouveau petit ami, Enum <T>

Cet article décrit un moyen de créer une classe d’assistance générique très simple qui vous permet d’éviter la syntaxe de transposition laide inhérente à Enum.Parse.

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

Ou consultez certains des commentaires dans le même post qui parlent d’utiliser une méthode d’extension pour obtenir des résultats similaires. 

0
Julian Martin

Comme mentionné dans les réponses précédentes, vous pouvez convertir directement le type de données sous-jacent (int -> type enum) ou analyser (chaîne -> type enum).

mais méfiez-vous - il n'y a pas .TryParse pour les énumérations, vous aurez donc besoin d'un bloc try/catch autour de l'analyse pour détecter les échecs.

0
Addys
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);
        }
    }
}
0
Raja