webentwicklung-frage-antwort-db.com.de

Suchen Sie nach einer Zeichenfolge in Enum und geben Sie das Enum zurück

Ich habe eine Aufzählung:

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

und ich habe eine Zeichenfolge:

string colour = "Red";

Ich möchte zurückkehren können:

MyColours.Red

von:

public MyColours GetColour(string colour)

Bisher habe ich:

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

Wie Sie sehen können, bin ich etwas festgefahren. Gibt es trotzdem einen Enumerator nach Wert auszuwählen. So etwas wie:

MyColour(2) 

würde ergeben

MyColour.Green
132
Matt Clarkson

check out System.Enum.Parse:


enum Colors {Red, Green, Blue}

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

Sie können das int in eine Enumeration umwandeln

(MyColour)2

Es gibt auch die Option Enum.Parse

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

Angesichts der neuesten und größten Änderungen an .NET (+ Core) und C # 7 ist hier die beste Lösung:

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

die Farbvariable kann innerhalb von Enum.TryParse verwendet werden

7
Roman

Sie brauchen nur Enum.Parse

4
Bruno Brant

Ich habe die Antwort von OregonGhost mit +1 markiert, dann habe ich versucht, die Iteration zu verwenden und merkte, dass dies nicht ganz richtig war, da Enum.GetNames Strings zurückgibt. Sie möchten 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

Sie können Enum.Parse verwenden, um aus dem Namen einen Aufzählungswert zu erhalten. Sie können alle Werte mit Enum.GetNames durchlaufen und Sie können einfach ein int in eine Aufzählung umwandeln, um den Aufzählungswert aus dem int-Wert zu erhalten.

So zum Beispiel:

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
}

oder:

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

Letzteres löst eine ArgumentException aus, wenn der Wert nicht gefunden wird. Möglicherweise möchten Sie ihn in der Funktion abfangen und den Standardwert zurückgeben.

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

Eine Sache, die für Sie nützlich sein könnte (abgesehen von den bisher gültigen/guten Antworten) ist die StringEnum-Idee hier

Damit können Sie Ihre Enumerationen als Klassen definieren (die Beispiele sind in vb.net):

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

Klasse beenden

Und jetzt könnten Sie diese Klasse wie ein Enum verwenden: eAuthenticationMethod.WindowsAuthentication. Dies würde im Wesentlichen so aussehen, als würde 'W' den logischen Wert von WindowsAuthentication (innerhalb der Enumeration) und Wenn Sie diesen Wert in einem Eigenschaftsfenster anzeigen möchten (oder etwas anderes, das die Eigenschaft System.ComponentModel.Description verwendet), würden Sie "Use Windows Authentication" erhalten.

Ich benutze das schon lange und es macht den Code absichtlich klarer.

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

Vielleicht möchten Sie auch einige Vorschläge in diesem Blogbeitrag lesen: Mein neuer kleiner Freund, Enum <T>

Der Beitrag beschreibt eine Möglichkeit, eine sehr einfache generische Hilfsklasse zu erstellen, mit der Sie die hässliche Casting-Syntax von Enum.Parse vermeiden können.

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

Oder lesen Sie einige Kommentare in demselben Beitrag, in denen Sie davon sprechen, eine Erweiterungsmethode zu verwenden, um ähnliche Ergebnisse zu erzielen. 

0
Julian Martin

Wie in den vorherigen Antworten erwähnt, können Sie direkt auf den zugrunde liegenden Datentyp (int -> Aufzählungstyp) oder auf parse (Zeichenfolge -> Aufzählungstyp) anwenden.

aber Vorsicht - es gibt kein .TryParse für Enums, Sie werden also einen try/catch-Block um die Analyse brauchen, um Fehler zu erkennen.

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