【问题标题】:Most Efficient Way to Test Object Type测试对象类型的最有效方法
【发布时间】:2010-09-05 08:16:22
【问题描述】:

我将值作为字符串存储在 DataTable 中,其中每个值都可以真正表示 intdoublestring(在从外部数据源导入过程中,它们都被转换为字符串) .我需要测试一下,看看每个值到底是什么类型。

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

  1. 尝试转换为int(然后是double)。如果转换有效,则返回 true。如果抛出异常,返回false
  2. 设计用于匹配intdouble 模式的正则表达式
  3. 其他方法?

【问题讨论】:

    标签: c# .net double int


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我想说,不要太担心这种微观性能。最好只是让一些东西工作,然后让它尽可能清晰、简洁和易于阅读。你能做的最糟糕的事情就是牺牲可读性来换取微不足道的性能。

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

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

      【讨论】:

        【解决方案3】:

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

        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 时对双精度进行下限。

        【讨论】:

          【解决方案4】:

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

          3 可以是 int、double 或 string!

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

          【讨论】:

          • 最终目标是尝试确定对象的最独占数据类型。 3 将是一个整数。 3.5 是双倍的。 “三”将是一个字符串。我最终组合了一个函数,它尝试了一堆 object.TryParse 调用,直到它可以确定什么是“最合适”的数据类型。
          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2011-08-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-07-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多