【问题标题】:Search for a string in Enum and return the Enum在 Enum 中搜索字符串并返回 Enum
【发布时间】:2011-01-18 09:59:04
【问题描述】:

我有一个枚举:

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

【问题讨论】:

标签: c# string enumeration


【解决方案1】:

试试这个方法。

public static class Helper
{
  public static T FromStr<T>(string str) where T : struct, System.Enum
    => System.Enum.TryParse<T>(value:str,ignoreCase:true,result:out var result)
    ? result
    : default;
  public static T? FromStrNull<T>(string str) where T : struct, System.Enum
    => System.Enum.TryParse<T>(value: str,ignoreCase: true,result: out var result)
    ? result
    : null;
}

并像这样使用它

var color = Helper.FromStr<MyColours>("red");

【讨论】:

    【解决方案2】:
    var color =  Enum.Parse<Colors>("Green");
    

    【讨论】:

    • 这甚至不能编译。没有通用的Parse 方法。
    • 它为我编译并工作。也许这取决于您使用的版本?我正在使用 .NET 核心 3.1
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:
      (MyColours)Enum.Parse(typeof(MyColours), "red", true); // MyColours.Red
      (int)((MyColours)Enum.Parse(typeof(MyColours), "red", true)); // 0
      

      【讨论】:

        【解决方案5】:

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

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

        Public 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 属性的其他窗口)查看此值,您将获得“Use Windows Authentication”。 p>

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:
            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);
                    }
                }
            }
            

            【讨论】:

            • C# 对此具有内置功能。
            • 如何回答这个问题?查看其他答案以获得更简单的代码
            【解决方案8】:

            您可能还想查看这篇博文中的一些建议: My new little friend, Enum<T>

            这篇文章描述了一种创建一个非常简单的通用帮助器类的方法,它使您能够避免 Enum.Parse 固有的丑陋的强制转换语法——相反,您最终会在代码中编写类似这样的东西:

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

            或者查看同一篇文章中的一些 cmets,其中讨论了使用扩展方法来实现类似的功能。

            【讨论】:

            • 帖子链接坏了。
            【解决方案9】:

            正如前面的答案中提到的,您可以直接转换为底层数据类型(int -> enum 类型)或解析(string -> enum 类型)。

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

            【讨论】:

            【解决方案10】:

            您可以将 int 转换为枚举

            (MyColour)2
            

            还有Enum.Parse的选项

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

            【讨论】:

              【解决方案11】:

              查看 System.Enum.Parse:

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

              【讨论】:

              • 别忘了你可以通过传入第三个可选参数为“true”来忽略大小写敏感
              • 正是我想要的!干杯!
              • @user1531040 其实有一个 Enum.TryParse。
              • 请注意,如果输入是数字,枚举解析总是“成功”;它只返回解析后的数字,然后将其转换为枚举的类型。因此,如果您想检查某些用户输入是否是有效的枚举或其他内容,您应该首先检查数字内容。由于它返回一个有效的枚举,但其值在定义的枚举名称中可能根本不存在,因此您可能会遇到一些非常奇怪的问题。
              【解决方案12】:

              您只需要Enum.Parse

              【讨论】:

                【解决方案13】:

                您可以使用Enum.Parse 从名称中获取枚举值。您可以使用 Enum.GetNames 遍历所有值,并且只需将 int 强制转换为 enum 即可从 int 值中获取 enum 值。

                像这样,例如:

                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 的回答所示。
                猜你喜欢
                • 1970-01-01
                • 2012-05-02
                • 2017-03-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-12-13
                • 2014-07-26
                相关资源
                最近更新 更多