一倍。TryParse或转换。ToDouble-这是更快和更安全吗?
题
我的申请读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<string, double>
因为下列分析算法的问题。
我的问题:哪个方向是更快吗?这是安全?
是更好的称呼 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
's例外提高会毁了你的性能。
因此,这里的另一个投票 TryParse
有一些数字。
其他提示
开始我会使用 double.Parse
而不是 Convert.ToDouble
在第一位。
你是否应该使用 Parse
或 TryParse
:你可以继续如果有坏输入数据,或者是一个真正特殊的情况?如果是特殊的,使用 Parse
并让它炸毁,如果输入是坏的。如果这是预期的和可以完全处理、使用 TryParse
.
。净框架的设计准则建议使用的尝试的方法。避免的例外情况通常是一个很好的想法。
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%确定的输入,这是很少的情况下,应使用双重。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.
速度的分析变得次要当你把一个例外,因为没有慢得多于一个例外。
很多讨厌的转换类在这里...只是为平衡一点,有一个优势转换-如果你是交给一个目的,
Convert.ToDouble(o);
可以刚刚返回的价值很容易,如果o已经是一个双人(或一个int或任何容易料).
使用双重。分析或一倍。TryParse是巨大的,如果你已经有一串,但是
Double.Parse(o.ToString());
有去 让 串进行分析第一和根据你的输入,可能更加昂贵。
一倍。TryParse国际海事组织。
它是容易处理,你就会知道到底在哪里发生的错误。
然后你就可以处理如何您认为合适,如果返回false(i。e不能转换).
我总是优选的使用 TryParse()
方法,因为它要吐回的成功或失败的转换,无需担心的例外情况。
就个人而言,我找到的 TryParse
方法的更易于阅读,其中一个你就会想到使用取决于您的使用情况:如果错误可以处理当地的你期待错误和bool从 TryParse
是好的,还有你可能想要就让的例外飞行。
我期望的 TryParse
要快,因为它避免了的开销的例外处理。但是,使用一个基准工具,就像 Jon双向飞碟的MiniBench 比较各种可能性。
这是一个有趣的老问题。我增加一个回答,因为没有人注意到一对夫妇的事情与原始的问题。
这是速度快:转换。ToDouble或一倍。TryParse?这是安全:转换。ToDouble或一倍。TryParse?
我要回答这两个问题(我会更新的回答后),详细,但是,首先:
对于安全,事情 每 程序错过了这个问题的行(强调地雷):
它只会增加数据数字与几位(1000 1000,2 1000,34- 逗号分隔在俄罗斯的标准).
随后这种代码的例子:
Convert.ToDouble(regionData, CultureInfo.CurrentCulture);
是,什么是有趣的是,如果电子表格是在俄罗斯号的格式,但Excel没有正确类型的小区域,什么是正确的解释的值来自Excel?
这里是另一个有趣的事情的两个例子,关于速度:
catch (InvalidCastException)
{
// is not a number
}
这很可能会产生集,看起来是这样的:
catch [mscorlib]System.InvalidCastException
{
IL_0023: stloc.0
IL_0024: nop
IL_0025: ldloc.0
IL_0026: nop
IL_002b: nop
IL_002c: nop
IL_002d: leave.s IL_002f
} // end handler
IL_002f: nop
IL_0030: return
在这个意义上,我们或许可以比较总数的集的指示进行的每一程序的更多后来作为我更新这一员额。
我相信代码应该是正确的、清晰、快速的... 在这了!