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
check out System.Enum.Parse:
enum Colors {Red, Green, Blue}
// your code:
Colors color = (Colors)System.Enum.Parse(typeof(Colors), "Green");
Sie können das int in eine Enumeration umwandeln
(MyColour)2
Es gibt auch die Option Enum.Parse
(MyColour)Enum.Parse(typeof(MyColour), "Red")
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
Sie brauchen nur Enum.Parse .
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;
}
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.
(MyColours)Enum.Parse(typeof(MyColours), "red", true); // MyColours.Red
(int)((MyColours)Enum.Parse(typeof(MyColours), "red", true)); // 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.
var color = Enum.Parse<Colors>("Green");
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.
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.
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);
}
}
}