【问题标题】:how to compare string with enum in C#如何在C#中将字符串与枚举进行比较
【发布时间】:2012-07-16 16:50:31
【问题描述】:
string strName = "John";
public enum Name { John,Peter }

private void DoSomething(string myname)
{
case1:
     if(myname.Equals(Name.John) //returns false
     {

     }

case2:
     if(myname == Name.John) //compilation error
     {

     }

case3:
     if(myname.Equals(Name.John.ToString()) //returns true (correct comparision)
     {

     }
}

当我使用.Equals 时,它是参考比较,当我使用== 时,它意味着值比较。

有没有更好的代码而不是将枚举值转换为ToString() 进行比较?因为它破坏了值类型枚举的目的,而且枚举上的ToString() 已被弃用??

【问题讨论】:

  • 你如何将字符串与枚举值进行比较?有没有办法完全避免这种情况?
  • 试图将枚举与字符串进行比较是个坏主意。
  • @SecurityHound 通常在处理其他代码库时这是不可避免的。

标签: c# .net


【解决方案1】:

您可以使用Enum.TryParse()方法将字符串转换为等效的枚举值(假设它存在):

Name myName;
if (Enum.TryParse(nameString, out myName))
{
    switch (myName) { case John: ... }
}

【讨论】:

  • 这比比较每个枚举的ToString() 值要好得多。 :)
  • MyEnumValue.ToString() 有什么不好?
  • @Heinzlmaen - ToString() 有效,但您会多次比较 2 个字符串(对于每个枚举) - nameString.Equals(JohnEnum.ToString())。你可能有大写/小写等错误。使用 Enum.TryParse 允许您使用 switch 语句,这在我看来更清晰,如果您必须转换为小写等,您只需在 Enum.TryParse(nameString.ToLowerInvariant(), out我的名字))。
【解决方案2】:

您可以解析字符串值并进行枚举比较。

Enum.TryParse:见http://msdn.microsoft.com/en-us/library/dd783499.aspx

Name result;
if (Enum.TryParse(myname, out result))
{
    switch (result)
    {
        case Name.John:
            /* do 'John' logic */
            break;
        default:
            /* unexpected/unspecialized enum value, do general logic */
            break;
    }
}
else 
{
    /* invalid enum value, handle */
}

如果您只是比较单个值:

Name result;
if (Enum.TryParse(myname, out result) && result == Name.John)
{
     /* do 'John' logic */
}
else 
{
    /* do non-'John' logic */
}

【讨论】:

  • 这是一个错误,现在我无法重做,直到您编辑答案。对不起。
【解决方案3】:

如果您使用 .NET4 或更高版本,则可以使用 Enum.TryParseEnum.Parse 可用于 .NET2 及更高版本

// .NET2 and later
try
{
    switch (Enum.Parse(typeof(Names), myName))
    {
        case John: ... 
        case Peter: ...
    }
}

// .NET4 and later
Name name;
if (Enum.TryParse(myName, out name))
    switch (name)
    {
        case John: ... 
        case Peter: ...
    }

【讨论】:

    【解决方案4】:

    一种解决方案可能是获取枚举的类型,然后是类型名称。

    myname.Equals(Enum.GetName(typeof(Name)))
    

    http://msdn.microsoft.com/en-us/library/system.enum.getname.aspx

    【讨论】:

      【解决方案5】:

      由于某种原因,给定的解决方案不适合我。我不得不以稍微不同的方式做:

      Name myName;
      if (Enum.TryParse<Name>(nameString, out myName))
      {
          switch (myName) { case John: ... }
      }
      

      希望它可以帮助某人:)

      【讨论】:

        【解决方案6】:

        我认为您正在寻找Enum.Parse() 方法。

        if(myname.Equals(Enum.Parse(Name.John)) //returns false
         {
        
         }
        

        【讨论】:

          【解决方案7】:

          一个更优雅的解决方案是字符串扩展方法:

          public static bool Equals(this string enumString, Name value)
          {
              if(Enum.TryParse<Name>(enumString, out var v))
              {
                  return value == v;
              }
          
              return false;
          }
          

          这样您就可以直接在字符串上使用 .Equals() ,就像 OPs 第一个示例中一样。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-02-16
            • 1970-01-01
            • 2022-08-12
            相关资源
            最近更新 更多