C#尝试Parse返回0

时间:2017-06-21 14:09:55

标签: c#

我正在尝试解析一个字符串以返回这样的int:

private UserCredentials GetAddressBook(string userName)
{
  int addressBookId = 0;
  int.TryParse(userName, out addressBookId);
  return this.GetAddressBook(addressBookId);
}

我的问题是addressBookId始终为0.我的userName是cara4。

2 个答案:

答案 0 :(得分:5)

cara4不是有效整数,因此您获得的默认值为0.始终评估返回的bool frrom int.TryParse以确定格式是否有效。

也许你想要:

private UserCredentials GetAddressBook(string userName)
{
  int addressBookId = 0;
  bool valid = int.TryParse(userName, out addressBookId);
  if(!valid) 
  {
      var lastDigits = userName.SkipWhile(char.IsLetter).TakeWhile(char.IsDigit);
      valid = int.TryParse(string.Concat(lastDigits), out addressBookId);
  }
  if(valid)
      return this.GetAddressBook(addressBookId);  
  else
      return null;
}

旁注:这个LINQ方法并不真正返回字符串的最后一位数字,而是返回第一个非数字后面的数字,因此"cara1foo2"会返回1。如果您的逻辑是addressBookId在最后,您可以使用:

var lastDigits = userName.Reverse().TakeWhile(char.IsDigit).Reverse();

答案 1 :(得分:3)

通常Try.Parse用于if-block。这样你只有在解析工作时才会返回:

if(int.TryParse(userName, out addressBookId))
{
    return this.GetAddressBook(addressBookId);
}
else 
{
    return null;
}

您的问题是userName = "cara4"的值包含无效字符,不代表数字。如果转换成功,TryParse方法会将转换后的数字写入out参数(在您的情况下为addressBookId)。否则它出错了,你不应该使用addressBookId

的值