我的应用程序使用VSTO读取Excel文件并将读取的数据添加到StringDictionary
.它仅添加具有几位数字的数据(1000 1000,2 1000,34 - 逗号是俄罗斯标准中的分隔符).
最好检查当前字符串是否是合适的数字?
object data, string key; // data had read try { Convert.ToDouble(regionData, CultureInfo.CurrentCulture); dic.Add(key, regionData.ToString()); } catch (InvalidCastException) { // is not a number }
要么
double d; string str = data.ToString(); if (Double.TryParse(str, out d)) // if done, then is a number { dic.Add(key, str); }
我必须使用StringDictionary
而不是Dictionary
因为以下解析算法问题.
我的问题:哪种方式更快?哪个更安全?
打电话Convert.ToDouble(object)
或者打电话会更好Convert.ToDouble(string)
吗?
我在发布模式下做了一个快速的非科学测试.我在两种方法中使用了两个输入:"2.34523"和"badinput",迭代次数为1,000,000次.
有效输入:
Double.TryParse = 646ms Convert.ToDouble = 662 ms
正如所料,没有太大的不同.对于所有意图和目的,对于有效输入,这些是相同的.
输入无效:
Double.TryParse = 612ms Convert.ToDouble = ..
嗯..它运行了很长时间.我使用1000次迭代重新编写了整个内容Convert.ToDouble
,输入错误需要8.3秒.将其平均化,需要2个多小时.在输入无效的情况下,我不在乎测试的基本程度如何Convert.ToDouble
异常提升会破坏你的表现.
所以,这是另一个投票支持TryParse
一些数字支持它.
首先,我会使用double.Parse
而不是Convert.ToDouble
首先使用.
至于你是否应该使用Parse
或TryParse
:如果输入数据不好,你能继续进行,还是这是一个非常特殊的条件?如果它是特殊的,使用Parse
并在输入不良时让它爆炸.如果它是预期的并且可以干净地处理,请使用TryParse
.
.NET Framework设计指南建议使用Try方法.避免异常通常是个好主意.
Convert.ToDouble(object)
会做 ((IConvertible) object).ToDouble(null);
哪个会打电话 Convert.ToDouble(string, null)
所以调用字符串版本会更快.
但是,字符串版本只是这样做:
if (value == null) { return 0.0; } return double.Parse(value, NumberStyles.Float | NumberStyles.AllowThousands, provider);
所以double.Parse
直接做这件事会更快.
如果您不打算处理异常,请使用TryParse.TryParse更快,因为它不必处理整个异常堆栈跟踪.
我一般都试图避免使用Convert
类(意思是:我不使用它),因为我发现它非常令人困惑:代码提供的关于这里究竟发生了什么的提示太少,因为Convert
允许使用相同的代码进行大量语义上非常不同的转换.这使得很难控制程序员究竟发生了什么.
因此,我的建议是永远不要使用这门课程.它也不是必需的(除了数字的二进制格式化,因为ToString
数字类的常规方法不提供适当的方法来执行此操作).
除非你100%确定你的输入,这种情况很少,你应该使用Double.TryParse.
Convert.ToDouble will throw an exception on non-numbers Double.Parse will throw an exception on non-numbers or null Double.TryParse will return false or 0 on any of the above without generating an exception.
抛出异常时,解析的速度变为次要因为没有比异常慢得多的速度.