Wyszukaj ciąg w Enum i zwróć Enum
Mam wyliczenie:
public enum MyColours
{
Red,
Green,
Blue,
Yellow,
Fuchsia,
Aqua,
Orange
}
I mam ciąg:
string colour = "Red";
Chcę móc wrócić:
MyColours.Red
From:
public MyColours GetColour(string colour)
Do tej pory mam:
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?
}
Jak widzisz, utknąłem. Czy istnieje i tak, aby wybrać enumerator według wartości. Coś w stylu:
MyColour(2)
Spowodowałoby
MyColour.Green
12 answers
Sprawdź System.Enum.Parse:
enum Colors {Red, Green, Blue}
// your code:
Colors color = (Colors)System.Enum.Parse(typeof(Colors), "Green");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-18 16:39:01
Możesz dodać int do enum
(MyColour)2
Istnieje również opcja Enum.Parse
(MyColour)Enum.Parse(typeof(MyColour), "Red")
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-18 16:39:32
Biorąc pod uwagę najnowsze i największe zmiany w. NET (+Core) i C# 7, Oto najlepsze rozwiązanie:
var ignoreCase = true;
Enum.TryParse("red", ignoreCase , out MyColours colour);
Zmienna koloru może być używana w ramach Enum.TryParse
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-27 15:20:06
Wszystko czego potrzebujesz to Enum.Parse .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-18 16:38:16
Zaznaczyłem odpowiedź OregonGhost +1, potem spróbowałem użyć iteracji i zdałem sobie sprawę, że to nie do końca dobrze, bo Enum.GetNames zwraca ciągi. Chcesz Enum.GetValues:
public MyColours GetColours(string colour)
{
foreach (MyColours mc in Enum.GetValues(typeof(MyColours)))
if (mc.ToString() == surveySystem)
return mc;
return MyColors.Default;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-07 16:02:44
var color = Enum.Parse<Colors>("Green");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-27 17:12:19
Możesz użyć Enum.Parse
, aby uzyskać wartość enum z nazwy. Możesz iterować wszystkie wartości za pomocą Enum.GetNames
i możesz po prostu rzucić int do enum, aby uzyskać wartość enum z wartości int.
Jak na przykład:
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
}
Lub:
public MyColours GetColours(string colour)
{
return (MyColours)Enum.Parse(typeof(MyColours), colour, true); // true = ignoreCase
}
Ten ostatni rzuci ArgumentException jeśli wartość nie zostanie znaleziona, możesz chcieć złapać ją wewnątrz funkcji i zwrócić wartość domyślną.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-18 16:38:14
Jak wspomniano w poprzednich odpowiedziach, możesz przesyłać bezpośrednio do bazowego typu danych (int - > Typ enum) lub parse (string -> Typ enum).
Ale uważaj - nie ma .Spróbuj przeliczyć liczby, więc będziesz potrzebował bloku try/catch wokół parse, aby wyłapać błędy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-18 16:39:58
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);
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-02 02:24:36
Jedna rzecz, która może być dla Ciebie przydatna (poza już poprawnymi / dobrymi odpowiedziami podanymi do tej pory), to pomysł StringEnum dostarczony Tutaj
Dzięki temu możesz zdefiniować swoje wyliczenia jako klasy (przykłady są w vb.net): {]}
Public NotInheritable Class eAuthenticationMethod dziedziczy StringEnumBase(z 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 Klasa
I teraz możesz użyć tej klasy, tak jak używasz enum: eAuthenticationMethod.WindowsAuthentication i byłoby to zasadniczo jak przypisanie' W ' wartości logicznej WindowsAuthentication (wewnątrz enum) i jeśli chcesz wyświetlić tę wartość z okna Właściwości (lub czegoś innego, które używa systemu.ComponentModel.Opis właściwości) otrzymasz " Use Windows Authentication ".
Używam tego do od dawna i to sprawia, że kod jest bardziej jasny w intencjach.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-04 12:23:41
(MyColours)Enum.Parse(typeof(MyColours), "red", true); // MyColours.Red
(int)((MyColours)Enum.Parse(typeof(MyColours), "red", true)); // 0
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-09 07:30:40
Możesz również zapoznać się z niektórymi sugestiami zawartymi w tym poście na blogu:
Mój nowy mały przyjaciel, Enum
W poście opisano sposób na stworzenie bardzo prostej, generycznej klasy pomocniczej, która pozwala uniknąć brzydkiej składni rzucania związanej z Enum.Parse
- zamiast tego piszesz coś takiego w swoim kodzie:
MyColours colour = Enum<MyColours>.Parse(stringValue);
Lub sprawdź niektóre komentarze w tym samym poście, które mówią o użyciu metody rozszerzenia, aby osiągnąć podobne.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-18 22:02:51