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

对于应用程序来说,什么更有效(或者没有实际差异)?

  1. 尝试转换为 int (进而 double)。如果转换有效,则返回 true. 。如果抛出异常,则返回 false.
  2. 正则表达式旨在匹配模式 int 或者 double
  3. 还有其他方法吗?
有帮助吗?

解决方案

会使用 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。这些方法的性能相当快。他们都返回一个布尔值。如果两者都失败,那么根据您定义数据的方式,您将得到一个字符串。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top