如何使用int.TryParse与nullable int?

时间:2010-08-02 18:39:53

标签: c#

我正在尝试使用TryParse来查找字符串值是否为整数。如果该值是整数,则跳过foreach循环。这是我的代码。

string strValue = "42 "

 if (int.TryParse(trim(strValue) , intVal)) == false
 {
    break;
 }

intVal是int类型的变量(可空INT)。如何将tryparse与nullable int一起使用?

5 个答案:

答案 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)