2013-08-20 63 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