c# -测试对象类型的最有效方法

Translate

我将值存储为字符串DataTable每个值都可以真正代表一个int, double, 要么string(在从外部数据源的导入过程中,它们都被转换为字符串)。我需要测试并查看每个值的真正类型。

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

  1. 尝试转换为int(接着double)。如果转换有效,则返回true。如果抛出异常,则返回false.
  2. 正则表达式旨在匹配int要么double
  3. 还有其他方法吗?
This question and all comments follow the "Attribution Required."

所有的回答

gil
Translate

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

来源
Translate

我会说,不必太担心这种微性能。最好先做一些工作,然后使其尽可能简洁明了且易于阅读。您能做的最坏的事情是牺牲可读性,而获得的性能却微不足道。

最后,处理性能问题的最佳方法是在有表明实际性能问题的数据时保存它们……否则,您将花费大量时间进行微优化,并且实际上会导致更高的维护成本。稍后的。

如果您发现这种解析情况确实是应用程序中的瓶颈,那么该是时候尝试找出解决问题最快的方法了。我认为Jeff(和许多其他人)已经在博客上发表了很多这类文章。

来源
Translate

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

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,则方法最快;如果不包含int,则方法最慢(甚至比GetType)。int.TryParse如果有字符串,则很快,但是如果有未知对象,则速度较慢。

有趣的是,随着.Net 3.5和优化功能的启用,o is int检查所需的时间与try-catch当o实际上是一个int时。o is int如果o实际上是其他东西,则只会稍微慢一点。

烦人的是,如果您执行以下操作,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并降低双精度数。

来源
Translate

您遇到的麻烦是,在某些情况下答案可能是这三种类型。

3可以是整数,双精度或字符串!

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

来源
Translate

我个人使用int.tryparse,然后使用double.tryparse。这些方法的性能非常快。它们都返回一个布尔值。如果两者均失败,则根据定义数据的方式,您将获得一个字符串。

来源