检查Int32.TryParse的方法更简单

时间:2014-10-10 15:48:44

标签: c#

我在代码中的方法中看到了很多这些:

int num1 = 0;
if (Char.IsDigit(myStr[2]) && Int32.TryParse(myStr[2].ToString(), out num1) == false)
{
    valid = false;
}

那么他们只是确保第三个字符为数字吗?

6 个答案:

答案 0 :(得分:7)

显示的代码仅解析第3个字符 - 检查它是否为数字,然后解析该单个字符的字符串表示。相反,只使用该字符的数值

if(myStr[2] >= '0' && myStr[2] <= '9') {
    num1 = (int)myStr[2] - (int)'0';
} else {
    valid = false
}

答案 1 :(得分:5)

您可以安全地跳过IsDigit()检查,因为它是多余的。

TryParse()如果不是数字则会失败。

正如其他人所指出的,Char.IsDigit()更快。如果您的代码对性能敏感,则检查是有意义的。

如果您保留IsDigit支票,那么您可以将TryParse缩减为Int32.Parse(),因为此时解析不会失败。

答案 2 :(得分:4)

看起来你所拥有的代码就是为了提高效率。编码这个的人知道myStr中字符串的结构,有时在第三个位置有一个非数字符号。这就是为什么他在支付将字符数组转换为字符串然后被解析之前进行优化以检查第三个符号的原因。

很可能,这种优化还为时过早:尽管暂时抛弃字符串并不是免费的,但只有在非常紧凑的循环中进行大量渲染时,这种优化才有意义。换句话说,只有当它在性能分析器的输出中显示在顶部附近时才会这样做。

您可以优化此检查以避免if

int num1 = 0;
valid &= !Char.IsDigit(myStr[2]) || Int32.TryParse(myStr[2].ToString(), out num1);

答案 3 :(得分:3)

我不相信你需要第一部分(它也可以抛出IndexOutOfRangeException)。

所以我可能会使用:

int num1 = 0;
if (myStr.Length > 2 && Int32.TryParse(myStr[2].ToString(), out num1) == false)
{
  valid = false;
}

答案 4 :(得分:1)

Char.IsDigit方法(String,Int32)

指示指定字符串中指定位置的字符是否归类为十进制数字。

Link

Int32.TryParse方法

将数字的字符串表示形式转换为其等效的32位有符号整数。返回值表示操作是否成功。该成员超载。

Link

编辑:

首先我写道,你可以跳过任何检查,但现在我写的是你不能,因为

if (Char.IsDigit(myStr[2]) && Int32.TryParse(myStr[2].ToString(), out num1) == false)
{ }
如果Char.IsDigit()包含here列出的任何Unicode字符,则{p> true将返回myStr[2],但Int.TryParse()不会转换除0-9之外的任何数字(不确定这一点,因为我没有检查所有这些)所以它将返回false你正在检查......

以下示例可以理解您正在检查的条件:

string x = "AS௭s";
int s = 0;
if (Char.IsDigit(x[2]) && int.TryParse(x[2].ToString(), out s) == false)
{
    // even if '௭` is Tamil Digit Seven and 'Char.IsDigit()' will return true but 
    // int.TryParse() will return false because it can not convert it
    // so you are setting valid = false when the myStr contains a valid Unicode Character
    // for a digit but It can not be converted to integer by TryParse method...
    valid = false;
}

@Marc Gravell♦'s答案是检查此情况的最佳解决方案......

答案 5 :(得分:-3)

以下是我的写作方式:

int num1 = 0;
try
{
    num1 = Int32.Parse(myStr[2].ToString());
}
catch (Exception)
{
    valid = false;
}

这也是同样的事情,并且更容易阅读imho,哦&amp;你可以在catch中记录失败的解析。

或者你可以这样做:

int num1 = 0;
valid = Int32.TryParse(myStr[2].ToString(), out num1);