最有效的方式来测试对象类型
我有存储为DataTable
串,其中每个值可以真正代表值的int
,double
,或string
(在导入过程中,他们都转换为字符串,从外部数据源)。我需要测试一下每个值的真实类型。最有效的方式来测试对象类型
什么更有效的应用程序(或没有实际的区别)?
- 尝试转换为
int
(然后double
)。如果转换工作,返回true
。如果抛出异常,则返回false
。 - 正则表达式专为匹配
int
或double
的模式而设计 - 其他一些方法?
会使用double.TryParse,它具有性能优势。
我个人使用int.tryparse,然后double.tryparse。这些方法的性能非常快。他们都返回一个布尔值。如果两者都失败,那么你有一个字符串,根据你如何定义你的数据。
我会说,别担心这样的微观表现。让某些东西起作用好得多,然后尽可能简洁明了地阅读。你能做的最糟糕的事情就是牺牲可读性来减少微不足道的表现。
最后,处理性能问题的最好方法是将它们保存为当数据表明存在实际的性能问题时......否则,您将花费大量的时间进行微优化,并且实际上导致以后的维护成本会更高。
如果您发现此解析情况实际上是您的应用程序的瓶颈,那么现在是时候尝试并找出解决问题的最快方法。我认为杰夫(以及其他许多人)已经就这类事情进行了很多博客。
根据您是否使用优化进行编译,您将得到不同方法的不同结果。基本上,你有几种选择:
object o;
//checking with is
o is int
//check type
o.GetType() != typeof(int)
//cast and catch exception
try{ int j = (int) o; }
catch {}
//use the tryparse
int.TryParse(Convert.ToString(o), out j)
您可以轻松地设置,尝试这些10,000次和(当o是一个int时,它的别的测试)返回持续时间为每一个控制台应用程序。
try-catch
方法是最快的,如果对象确实保存一个int,并且到目前为止最慢如果它不是最慢(甚至比GetType
慢)。如果你有一个字符串,int.TryParse
是相当快的,但如果你有一个未知的对象,它会变慢。
有趣的是,在.Net 3.5和优化开启时,o is int
检查与try-catch
的检测时间相同,当o实际为int时。如果o实际上是别的东西,o is int
只会稍微慢一些。
,如果你这样做烦人的FxCop将引发了警告:
if(o is int)
int j = (int) o;
但我认为这是在FxCop的错误 - 它不知道int是值类型,建议您使用o as int
代替。
如果您的输入始终是字符串int.TryParse
是最好的,否则is
运算符是最快的。
由于你有一个字符串,我会看看你是否需要知道它是一个int,而不是double。如果int.TryParse
通过,那么double.TryParse
也是如此,因此您可以将检查数量减半 - 当您期望int时,返回double或string并返回double。
您遇到的问题是,可能会出现答案可能全是三种类型的情况。
3可能是一个int,一个双精度或一个字符串!
这取决于你想要做什么以及它们是一个特定类型的重要性。最好是尽可能长时间留下它们,或者用一种方法来标记每一个(如果你能控制原始字符串的来源)。
最终目标是尝试确定对象的最独特的数据类型。 3将是一个整数。 3.5将是双倍的。 “三”将是一个字符串。我最终组合了一个函数,尝试了一堆object.TryParse调用,直到它可以确定什么是“最适合”数据类型。 – 2008-09-25 14:06:44