在Enum中search一个string并返回Enum

我有一个枚举:

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

我有一个string:

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

正如你所看到的,我有点卡住了。 反正有select和枚举的价值。 就像是:

 MyColour(2) 

会导致

 MyColour.Green 

检查出System.Enum.Parse:

enum Colors {Red, Green, Blue} // your code: Colors color = (Colors)System.Enum.Parse(typeof(Colors), "Green");
enum Colors {Red, Green, Blue} // your code: Colors color = (Colors)System.Enum.Parse(typeof(Colors), "Green"); 

您可以将int转换为枚举

 (MyColour)2 

还有Enum.Parse的选项

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

所有你需要的是Enum.Parse 。

我标记了OregonGhost的答案+1,然后我尝试使用迭代,并意识到它不是很正确,因为Enum.GetNames返回string。 你想要Enum.GetValues:

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

您可以使用Enum.Parse从名称中获取枚举值。 你可以使用Enum.GetNames遍历所有的值,你可以将一个int值Enum.GetNames一个枚举值,从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如果没有find该值,你可能想要捕捉它在函数内并返回默认值。

正如前面的答案中所提到的,您可以直接将其转换为基础数据types(int – > enum type)或parsing(string – > enum type)。

但要小心 – 对于枚举没有.TryParse,所以你需要一个围绕parsing的try / catch块来捕获失败。

你可能也想看看这篇博文中的一些build议: 我的新朋友,Enum <T>

这篇文章描述了一种创build一个非常简单的generics助手类的方法,它可以避免Enum.Parse固有的难看的强制转换语法 – 而是最终在代码中写下类似这样的东西:

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

或者在同一篇文章中查看一些关于使用扩展方法实现类似function的评论。

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

有一件事可能对你有用(除了已经提供的有效/良好的答案)是在这里提供的StringEnum的想法

有了这个,你可以定义你的枚举类(例子在vb.net):

DebuggerStepThrough(),ImmutableObject(True)>公共NotInheritable类eAuthenticationMethodinheritanceStringEnumBase(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") 

末class

现在你可以使用这个类,因为你会使用枚举:eAuthenticationMethod.WindowsAuthentication,这实际上就像分配WWindowsAuthentication的逻辑值(枚举内),如果你是从一个属性窗口(或使用System.ComponentModel.Description属性的其他东西),您将得到“ 使用Windows身份validation ”。

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

 (MyColours)Enum.Parse(typeof(MyColours), "red", true); // MyColours.Red (int)((MyColours)Enum.Parse(typeof(MyColours), "red", true)); // 0