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
Author: Matt Clarkson, 2010-02-18

12 answers

Sprawdź System.Enum.Parse:


enum Colors {Red, Green, Blue}

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

 393
Author: JMarsch,
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")
 19
Author: Guvante,
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

 13
Author: Roman,
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 .

 5
Author: Bruno Brant,
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;
}
 2
Author: Colin,
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");
 2
Author: pampi,
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ą.

 1
Author: OregonGhost,
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.

 0
Author: Addys,
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);
        }
    }
}
 0
Author: Raja,
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.

 0
Author: Ando,
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
 0
Author: Sandeep Shekhawat,
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.

 -1
Author: Julian Martin,
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