在Enum中搜索一个字符串并返回Enum


163

我有一个枚举:

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


4
@nawfal,几年前我问这个的时候没有发现。已投票关闭为重复项。
马特·克拉克森

Answers:


381

签出System.Enum.Parse:


enum Colors {Red, Green, Blue}

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


72
不要忘了,你可以把它通过在第三个可选的参数传递是“真实的”忽略大小写
好氧

正是我想要的!干杯!
Zame

11
@ user1531040实际上,有一个Enum.TryParse。
DarLom

请注意,如果输入为数字,则枚举解析总是“成功”。它只返回解析后的数字,然后将其转换为枚举的类型。因此,如果要检查某些用户输入是否为有效的枚举或其他值,则应首先检查数字内容。由于它返回一个有效的枚举,但其值在定义的枚举名称中可能根本不存在,因此您会遇到一些非常奇怪的问题。
Nyerguds

19

您可以将int强制转换为枚举

(MyColour)2

还有Enum.Parse选项

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

11

鉴于.NET(+核心)和C#7的最新最大变化,这是最佳解决方案:

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

颜色变量可以在Enum.TryParse的范围内使用



2

我将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

您可以用来Enum.Parse从名称中获取枚举值。您可以使用遍历所有值Enum.GetNames,也可以将int强制转换为枚举,以从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,您可能希望将其捕获到函数中并返回默认值。


注意:当然,应该是Enum.GetValues,如Colin的答案所示。
OregonGhost

1
var color =  Enum.Parse<Colors>("Green");

这甚至不编译。没有通用Parse方法。
若昂Menighin

它编译并为我工作。也许取决于您使用的版本?我正在使用.NET Core 3.1
Vinni,

0

如前面的答案中所述,您可以直接转换为基础数据类型(int->枚举类型)或解析(字符串->枚举类型)。

但要注意-枚举没有.TryParse,因此您将需要在try周围使用try / catch块来捕获失败。


3
在问这个问题之前不是没有,但是现在有了.NET 4!msdn.microsoft.com/zh-CN/library/system.enum.tryparse.aspx。就像Enum.TryParse <MyColour>(“ Red”,外面的颜色一样)
WienerDog 2012年

0
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);
        }
    }
}

2
C#为此提供了内置功能。
Artemix 2012年

这如何回答问题?查看其他答案以获得更简单的代码
Firo 2012年

0

可能对您有用的一件事(除了到目前为止已提供的有效/良好答案)是此处提供的StringEnum想法

这样,您可以将枚举定义为类(示例在vb.net中):

<StringEnumRegisteredOnly(),DebuggerStepThrough(),ImmutableObject(True)>公共NotInheritable类eAuthenticationMethod继承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")   

末级

现在,您可以像使用枚举一样使用此类:eAuthenticationMethod.WindowsAuthentication,这本质上就像为W分配WindowsAuthentication的逻辑值(在枚举内部),以及是否要从属性中查看该值。窗口(或使用System.ComponentModel.Description属性的其他窗口),您将获得“ 使用Windows身份验证 ”。

我已经使用了很长时间了,它使代码的意图更加清晰。



-1

您可能还需要查看此博客文章中的一些建议: 我的新小朋友Enum <T>

文章描述了一种创建非常简单的通用帮助器类的方法,该类使您能够避免固有的丑陋转换语法Enum.Parse-相反,最终您在代码中编写了以下内容:

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

或查看同一篇文章中的一些评论,这些评论谈论使用扩展方法来实现类似效果。


帖子链接已损坏。
马查多
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.