解析为布尔值或检查字符串值

Posted

技术标签:

【中文标题】解析为布尔值或检查字符串值【英文标题】:Parse to Boolean or check String Value 【发布时间】:2013-08-22 03:31:53 【问题描述】:

如果我有一个变量可以从数据库中提取 truefalse 字符串, 哪种方法是检查其值的首选方式?

string value = "false";

if(Boolean.Parse(value))
   DoStuff();

我知道有不同的方式解析为 bool - 这是一个示例

string value = "false";

if(value == "true")
   DoStuff();

我从数据库中提取了很多 string 格式的真/假值,想知道这些方法是否会产生任何性能差异?

【问题讨论】:

任何一种方法都可以,但许多开发人员会更喜欢 Bool.TryParse()。第二种方法是字符串比较,会稍微慢一些,o(n^2) 【参考方案1】:

在 C# 7.0+ 中,您可以使用 inline variable declaration.

string value = "false";

if (bool.TryParse(value, out bool parsedValue))

    if (parsedValue)
    
        // do stuff
    
    else
    
        // do other stuff
    

else

    // unable to parse

【讨论】:

【参考方案2】:
string value = "your text"
bool outresult = false;
bool resultado = false;

resultado = bool.TryParse(value, out outresult);

try parse函数会尝试将字符串的值转换为布尔值,如果它不能返回变量outresult的值。

【讨论】:

这不能回答所提出的问题。也请使用英语发布到 ***。【参考方案3】:

请务必使用Boolean.TryParse(),您将避免可能弹出的区分大小写的问题。

【讨论】:

我可以看到区分大小写 - 但是文化问题? @JonSkeet 你是对的,我对避免解析布尔值的文化问题的个人扩展方法感到困惑。有时值可能会在系统文化中“翻译”出来(例如,意大利语中的 Vero-Falso),具体取决于它们的编写方式。我已经更新了答案。【参考方案4】:

当要求性能时,没有解析的版本可能会更快。但正如其他人已经建议的那样,我也更喜欢解析解决方案。

【讨论】:

【参考方案5】:

使用Boolean.TryParse:

string value = "false";
Boolean parsedValue;

if (Boolean.TryParse(value, out parsedValue))

      if (parsedValue)
      
         // do stuff
      
      else
      
         // do other stuff
      

else

   // unable to parse

【讨论】:

原来的 if/else 不应该是 try/catch 吗? @NewAmbition:不,因为TryParse如果转换成功则返回true,如果无法解析则返回false。 一个速记替代方案是bool parsed = Boolean.TryParse(stringToParse, out parsedValue) && parsedValue; @NewAmbition:是的,这将是一个替代方案。但是,如果您使用替代方案,您将无法确定转换是否成功。如果转换不成功,它只会返回 false。如果你使用我的代码,你就能知道转换是否成功。 好吧,如果转换不成功,它将返回 false。我根本不想争论你的观点,但如果一个人只是想得到结果,你可以这样做;)你的版本允许用户在尝试转换后做“任何事情”。【参考方案6】:

我总是会解析它——你的应用程序应该对无效值具有鲁棒性(即使你“知道”你的数据库总是有效的):

bool myVal;
if (!Boolean.TryParse(value, out myVal))

    throw new InvalidCastException(...); // Or do something else

【讨论】:

【参考方案7】:

如果您知道字符串将是有效的"true""false" 字符串,则首选您的第一种方法。

否则,您可以使用Boolean.TryParse

【讨论】:

【参考方案8】:

我在这里看到的唯一问题是 C# 会进行区分大小写的比较,所以如果数据库值为“True”

(value == "true")

将返回 false。

但是看例子Boolean.Parse Method

string[] values =  null, String.Empty, "True", "False", 
                      "true", "false", "    true    ", "0", 
                      "1", "-1", "string" ;
  foreach (var value in values) 
     try 
        bool flag = Boolean.Parse(value);
        Console.WriteLine("'0' --> 1", value, flag);
     
     catch (ArgumentException) 
        Console.WriteLine("Cannot parse a null string.");
        
     catch (FormatException) 
        Console.WriteLine("Cannot parse '0'.", value);
              
              

// The example displays the following output: 
//       Cannot parse a null string. 
//       Cannot parse ''. 
//       'True' --> True 
//       'False' --> False 
//       'true' --> True 
//       'false' --> False 
//       '    true    ' --> True 
//       Cannot parse '0'. 
//       Cannot parse '1'. 
//       Cannot parse '-1'. 
//       Cannot parse 'string'.

Bool.Parse 似乎更健壮一些。

【讨论】:

你应该使用 string.Equals() @SamLeach - 我认为这不是练习的重点。其次,在这种情况下你不应该使用 TryParse 吗(从其他答案来看?) 你绝对应该使用Boolean.TryParse()(见我的回答)但是如果你要比较字符串,你应该使用string.Equals()而不是==。这就是我的观点。 @SamLeach 既然字符串的== 运算符只调用string.Equals(),那么您为什么认为应该使用它呢?这同样适用于使用int.Equals() 而不是== @SamLeach 在这个例子中我们没有使用对象;我们使用的是string,因此不适用多态差异。因此,使用string 时,Equals()== 完全相同。

以上是关于解析为布尔值或检查字符串值的主要内容,如果未能解决你的问题,请参考以下文章

通过 IOS 从 ASP.NET Web API 获取布尔值或字符串

在 PHP 中将字符串解析为布尔值

如何将数组中的真假字符串解析为布尔值

如何检查具有布尔值的复选框

将字符串转换为布尔值[重复]

== 检查布尔值是不是完全相等? - 爪哇