在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,这实际上就像分配W的WindowsAuthentication的逻辑值(枚举内),如果你是从一个属性窗口(或使用System.ComponentModel.Description属性的其他东西),您将得到“ 使用Windows身份validation ”。
我已经使用了很长一段时间,它使代码更清晰的意图。
(MyColours)Enum.Parse(typeof(MyColours), "red", true); // MyColours.Red (int)((MyColours)Enum.Parse(typeof(MyColours), "red", true)); // 0