题
我将值存储为字符串 DataTable
其中每个值都可以真正代表一个 int
, double
, , 或者 string
(在从外部数据源导入过程中它们全部转换为字符串)。我需要测试并查看每个值到底是什么类型。
对于应用程序来说,什么更有效(或者没有实际差异)?
- 尝试转换为
int
(进而double
)。如果转换有效,则返回true
. 。如果抛出异常,则返回false
. - 正则表达式旨在匹配模式
int
或者double
- 还有其他方法吗?
解决方案
会使用 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,则该方法是最快的,如果不持有 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
因此,您可以将检查次数减半 - 返回 double 或 string,并在您期望 int 时将 double 取整。
您遇到的麻烦是,在某些情况下,答案可能是所有三种类型。
3 可以是 int、double 或 string!
这取决于您想要做什么以及它们是特定类型的重要性。最好尽可能地保留它们,或者,用一种方法来标记每个字符串(如果您可以控制原始字符串的来源)。
我个人会使用 int.tryparse,然后使用 double.tryparse。这些方法的性能相当快。他们都返回一个布尔值。如果两者都失败,那么根据您定义数据的方式,您将得到一个字符串。