2013-08-20 61 views
4

如果我有一个变量从数据库中抽取一个truefalse的字符串,那么这将是检查其值的首选方法?解析为布尔值或检查字符串值

string value = "false"; 

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

我知道有解析到布尔不同的方式 - 这是一个例子

string value = "false"; 

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

我拉了很多真/假值从数据库中string格式,并且想知道这些方法是否会带来任何性能差异?

+1

这两种方法都很好,但很多开发人员更喜欢Bool.TryParse()。第二种方法是字符串比较,它会稍微慢一些,o(n^2) – Gusdor

回答

15

使用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 
} 
+0

原来的if/else不应该是try/catch吗? – TheGeekZn

+1

@NewAmbition:不,因为如果转换成功,TryParse返回true,如果无法解析则返回false。 – ProgramFOX

+3

速记替代方法是'bool parsed = Boolean.TryParse(stringToParse,out parsedValue)&& parsedValue;' – TheGeekZn

3

我可以在这里看到的唯一问题是,C#不区分大小写的比较,因此,如果数据库值“真”

(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似乎有点更强健。

+0

您应该使用string.Equals() –

+0

@SamLeach - 我不认为这是练习的要点。其次,如果你不行在这种情况下使用TryParse(根据其他答案判断) – TheGeekZn

+1

您应该使用'Boolean.TryParse()'(请参阅我的答案),但如果要比较字符串,则应该使用'string.Equals()'而不是'=='。这是我的观点。 –

0

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

否则,你可以使用Boolean.TryParse

2

我总是会分析它 - 你的应用程序应该是反对无效值稳健(即使你“知道”你的数据库将始终是有效的):

bool myVal; 
if (!Boolean.TryParse(value, out myVal)) 
{ 
    throw new InvalidCastException(...); // Or do something else 
} 
1

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

+4

我可以看到大小写敏感但文化问题? –

+1

@JonSkeet你是对的,我与我的个人扩展方法混淆,避免文化问题解析布尔值。有时候,价值观可能会在系统文化中“翻译”出来(例如* Vero * - * Falso *意大利语),具体取决于它们的写法。我已经更新了答案。 –

0

当询问性能,而不解析版本将可能是一个更快的。但正如其他人已经建议,我也更喜欢解析解决方案。

0
bool outresult = false; 
bool resultado = false; 

resultado = bool.TryParse(chave, out outresult); 
+1

这并不回答被问到的问题。也请使用英文发布到StackOverflow。 – LordWilmore