Найдите строку в Enum и верните Enum - PullRequest
143 голосов
/ 18 февраля 2010

У меня есть перечисление:

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

и у меня есть строка:

string colour = "Red";

Я хочу иметь возможность вернуться:

MyColours.Red

от

public MyColours GetColour(string colour)

Пока у меня есть:

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

Как видите, я немного застрял. Есть ли в любом случае выбрать перечислитель по значению. Что-то вроде:

MyColour(2) 

приведет к

MyColour.Green

Ответы [ 12 ]

347 голосов
/ 18 февраля 2010

проверить System.Enum.Parse:


enum Colors {Red, Green, Blue}

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

18 голосов
/ 18 февраля 2010

Вы можете привести int к перечислению

(MyColour)2

Также есть опция Enum.Parse

(MyColour)Enum.Parse(typeof(MyColour), "Red")
9 голосов
/ 27 июня 2018

Учитывая последние и самые большие изменения в .NET (+ Core) и C # 7, вот лучшее решение:

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

переменная цвета может использоваться в рамках Enum.TryParse

5 голосов
/ 18 февраля 2010

Все, что вам нужно, это Enum.Parse .

2 голосов
/ 07 сентября 2011

Я пометил ответ OregonGhost +1, затем попытался использовать итерацию и понял, что она не совсем верна, потому что Enum.GetNames возвращает строки. Вы хотите Enum.GetValues:

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

   return MyColors.Default;
}
1 голос
/ 18 февраля 2010

Вы можете использовать Enum.Parse, чтобы получить значение enum из имени. Вы можете перебирать все значения с помощью Enum.GetNames, и вы можете просто привести int к enum, чтобы получить значение enum из значения int.

Вот так, например:

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
}

или

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

Последний вызовет исключение ArgumentException, если значение не найдено, вы можете перехватить его внутри функции и вернуть значение по умолчанию.

0 голосов
/ 27 ноября 2018
var color =  Enum.Parse<Colors>("Green");
0 голосов
/ 09 октября 2015
(MyColours)Enum.Parse(typeof(MyColours), "red", true); // MyColours.Red
(int)((MyColours)Enum.Parse(typeof(MyColours), "red", true)); // 0
0 голосов
/ 04 января 2012

Одна вещь, которая может быть полезна для вас (помимо уже имеющихся / хороших ответов, предоставленных к настоящему времени), это идея StringEnum, предоставленная здесь

С этим вы можете определить свои перечисления как классы(примеры приведены на vb.net):

Открытый не наследуемый класс eAuthenticationMethod наследует StringEnumBase (из * eAuthenticationMethod)1010 * Конечный класс

И теперь вы можете использовать этот класс, как если бы вы использовали enum: eAuthenticationMethod.WindowsAuthentication, и это по сути было бы похоже на присвоение ' W ' логическогозначение WindowsAuthentication (внутри перечисления), и если вы просматриваете это значение в окне свойств (или что-то еще, использующее свойство System.ComponentModel.Description), вы получите " Использовать проверку подлинности Windows ".

Я давно пользуюсь этим, и он делает трескуНамного яснее.

0 голосов
/ 02 марта 2011
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);
        }
    }
}
...