我正在尝试使用TryParse来查找字符串值是否为整数。如果该值是整数,则跳过foreach循环。这是我的代码。
string strValue = "42 "
if (int.TryParse(trim(strValue) , intVal)) == false
{
break;
}
intVal是int类型的变量(可空INT)。如何将tryparse与nullable int一起使用?
答案 0 :(得分:119)
这是使用TryParse
的可空int的选项public int? TryParseNullable(string val)
{
int outValue;
return int.TryParse(val, out outValue) ? (int?)outValue : null;
}
答案 1 :(得分:76)
不幸的是,如果不使用其他变量就不能这样做 - 因为out
参数的类型必须与参数完全匹配。
与Daniel的代码一样,但修正了第二个参数,修剪,并避免与布尔常量进行比较:
int tmp;
if (!int.TryParse(strValue.Trim(), out tmp))
{
break;
}
intVal = tmp;
答案 2 :(得分:20)
无法阻止自己制作通用版本。用法如下。
public class NullableHelper
{
public delegate bool TryDelegate<T>(string s, out T result);
public static bool TryParseNullable<T>(string s, out T? result, TryDelegate<T> tryDelegate) where T : struct
{
if (s == null)
{
result = null;
return true;
}
T temp;
bool success = tryDelegate(s, out temp);
result = temp;
return success;
}
public static T? ParseNullable<T>(string s, TryDelegate<T> tryDelegate) where T : struct
{
if (s == null)
{
return null;
}
T temp;
return tryDelegate(s, out temp)
? (T?)temp
: null;
}
}
bool? answer = NullableHelper.ParseNullable<bool>(answerAsString, Boolean.TryParse);
答案 3 :(得分:5)
您可以创建一个帮助方法来解析可以为空的值。
示例用法:
int? intVal;
if( !NullableInt.TryParse( "42", out intVal ) )
{
break;
}
帮手方法:
public static class NullableInt
{
public static bool TryParse( string text, out int? outValue )
{
int parsedValue;
bool success = int.TryParse( text, out parsedValue );
outValue = success ? (int?)parsedValue : null;
return success;
}
}
答案 4 :(得分:3)
您也可以为此目的制作扩展方法;
public static bool TryParse(this object value, out int? parsed)
{
parsed = null;
try
{
if (value == null)
return true;
int parsedValue;
parsed = int.TryParse(value.ToString(), out parsedValue) ? (int?)parsedValue : null;
return true;
}
catch (Exception)
{
return false;
}
}
我已将其设为object
类型的扩展程序,但同样可以在string
上。我个人认为这些解析器扩展可以在任何对象上使用,因此object
上的扩展名而不是string
。
使用示例:
[TestCase("1", 1)]
[TestCase("0", 0)]
[TestCase("-1", -1)]
[TestCase("2147483647", int.MaxValue)]
[TestCase("2147483648", null)]
[TestCase("-2147483648", int.MinValue)]
[TestCase("-2147483649", null)]
[TestCase("1.2", null)]
[TestCase("1 1", null)]
[TestCase("", null)]
[TestCase(null, null)]
[TestCase("not an int value", null)]
public void Should_parse_input_as_nullable_int(object input, int? expectedResult)
{
int? parsedValue;
bool parsingWasSuccessfull = input.TryParse(out parsedValue);
Assert.That(parsingWasSuccessfull);
Assert.That(parsedValue, Is.EqualTo(expectedResult));
}
缺点是这会破坏用于解析值的框架语法;
int.TryParse(input, out output))
但我喜欢它的较短版本(它是否更具可读性可能需要讨论);
input.TryParse(out output)