解析为布尔值或检查字符串值
Posted
技术标签:
【中文标题】解析为布尔值或检查字符串值【英文标题】:Parse to Boolean or check String Value 【发布时间】:2013-08-22 03:31:53 【问题描述】:如果我有一个变量可以从数据库中提取 true
或 false
字符串,
哪种方法是检查其值的首选方式?
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()
和==
完全相同。以上是关于解析为布尔值或检查字符串值的主要内容,如果未能解决你的问题,请参考以下文章