测试对象类型的最有效方式

我将值存储为 DataTable 中的字符串,其中每个值都可以表示 intdoublestring (在从外部数据源导入的过程中,它们全部转换为字符串)。我需要测试一下每个值的真实类型。

什么是更有效的应用程序(或没有实际的区别)?

  1. Try to convert to int (and then double). If conversion works, the return true. If an exception is thrown, return false.
  2. Regular expressions designed to match the pattern of an int or double
  3. Some other method?
0
额外 编辑
意见: 1

5 答案

我会说,不要太担心这种微观表现。让某些东西起作用好得多,然后尽可能简洁明了地阅读。你能做的最糟糕的事情就是牺牲可读性来减少微不足道的表现。

最终,处理性能问题的最佳方式是在数据存在时保存它们,以表明存在实际的性能问题......否则,您将花费大量时间进行微型优化,并且实际上导致维护成本增加稍后的。

如果您发现这种解析情况实际上是您的应用程序的瓶颈,那么现在是时候尝试并找出解决问题的最快方法。我认为杰夫(以及其他许多人)已经就这类事情进行了很多博客。

0
额外

我个人使用int.tryparse,然后double.tryparse。这些方法的性能非常快。他们都返回一个布尔值。如果两者都失败,那么你有一个字符串,根据你如何定义你的数据。

0
额外

会使用double.TryParse,它具有性能优势。

0
额外

对于不同的方法,您会得到不同的结果,具体取决于您是否使用优化进行编译。你基本上有几个选择:

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实际上是一个int时, o是int 检查与 try-catch 相同。如果o实际上是别的东西,o是int 只会稍微慢一些。

烦人的FxCop会抛出警告,如果你做了这样的事情:

if( o is int )
    int j = (int) o;

但我认为这是FxCop中的一个错误 - 它不知道int是一个值类型,并建议您使用 o作为int

如果你的输入总是一个字符串 int.TryParse 是最好的,否则运算符是最快的。

因为你有一个字符串,我会看看你是否需要知道它是一个int,而不是double。如果 int.TryParse 通过,那么 double.TryParse 所以你可以减半数的检查 - 当你期待int时返回double或string并且返回double。

0
额外

你遇到的麻烦是,有可能出现三种答案的情况。

3可以是一个int,一个双精度或一个字符串!

这取决于你想要做什么以及它们是一种特定类型的重要性。最好是尽可能长时间留下它们,或者用一种方法来标记每一个(如果你能控制原始字符串的来源)。

0
额外
最终目标是尝试确定对象的最独特的数据类型。 3将是一个整数。 3.5将是双倍的。 “三”将是一个字符串。我最终组合了一个函数,尝试了一堆object.TryParse调用,直到它可以确定什么是“最适合”数据类型。
额外 作者 Yaakov Ellis,