我的应用程序使用VSTO读取Excel文件,并将读取的数据加到StringDictionary.它只添加带有几位数字的数据(StringDictionary0,StringDictionary0,2,StringDictionary0,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);
}

I have to use StringDictionary instead of Dictionary<string, double> because of the following parsing alg或ithm issues.

我的问题是:哪条路更快?哪个更安全?

And is it better to call Convert.ToDouble(object)Convert.ToDouble(string) ?

推荐答案

我在发布模式下做了一个快速的非科学测试.我在这两个方法中使用了两个输入:"2.34523"和"badinput",并迭代了1000000次.

有效输入:

Double.TryParse = 646ms
Convert.ToDouble = 662 ms

和预期的没什么不同.对于所有意图和目的,对于有效输入,这些都是相同的.

无效输入:

Double.TryParse = 612ms
Convert.ToDouble = ..

好它运行了很长时间.我用Convert.ToDouble0次迭代和Convert.ToDouble次错误输入重新运行了整个过程,耗时8.3秒.平均起来,需要2个多小时.我不在乎测试有多基本,在无效输入的情况下,Convert.ToDouble的异常引发会毁掉你的表现.

所以,这是另一张TryParse票,并有一些数字来支持它.

.net相关问答推荐

SLN配置文件:映射问题

如何将 select 语句详细信息提取到不同的方法中仍然保持Eager 加载?

如何计算给定2个字符串的距离相似性度量?

如何在 FtpWebRequest 之前判断 FTP 上是否存在文件

C#6.0 字符串插值本地化

代理、包装器或外观类之间有什么区别

如何摆脱 VS2008 中的目标程序集不包含服务类型错误消息?

有什么方法可以使用 .NET 应用程序使用 git 吗?

为什么递归调用会导致不同堆栈深度的 StackOverflow?

如何通过 LINQ 比较没有时间的 DateTime?

序列化私有成员数据

运算符重载 ==, !=, Equals

[DllImport("QCall")] 是什么?

C# 属性实际上是方法吗?

WCF服务客户端:内容类型text/html;响应消息的charset=utf-8 与绑定的内容类型不匹配

为什么有些对象属性是 UnaryExpression 而有些是 MemberExpression?

在 .NET Core 中在 MVC 之外使用 Razor

如何从 WCF REST 方法返回自定义 HTTP 状态代码?

如何判断枚举是否包含数字?

如何在我的机器上找到 fuslogvw.exe?