如何使用int.TryParse与nullable int?

nav*_*100 90 c#

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

string strValue = "42 "

 if (int.TryParse(trim(strValue) , intVal)) == false
 {
    break;
 }
Run Code Online (Sandbox Code Playgroud)

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

Psy*_*der 127

这是使用TryParse的可空int的选项

public int? TryParseNullable(string val)
{
    int outValue;
    return int.TryParse(val, out outValue) ? (int?)outValue : null;
}
Run Code Online (Sandbox Code Playgroud)

  • 我不喜欢他的回答,因为它丢失了表示解析成功/失败的返回值.这是Try*方法的一个重要特征. (8认同)
  • 使用C#7它更容易,不需要有一个函数,一行就足够了:`int?myVal = int.TryParse(toCheck,out int tmp)?(int?)tmp:null;` (8认同)
  • 我喜欢这个版本,因为"0"返回0而"hello"返回null.在接受的答案中,区别就丢失了. (3认同)
  • @frattaro我真的不明白为什么这个答案可能很糟糕。Try parse 在失败时默认返回 0,在本示例中它只是返回 null。 (2认同)

Jon*_*eet 76

不幸的是,如果不使用另一个变量就不能这样做 - 因为out参数的类型必须与参数完全匹配.

像Daniel的代码一样,但修正了第二个参数,修剪,并避免与布尔常量进行比较:

int tmp;
if (!int.TryParse(strValue.Trim(), out tmp))
{
    break;
}
intVal = tmp;
Run Code Online (Sandbox Code Playgroud)

  • 使用c#7,它是一行:`int?myVal = int.TryParse(toCheck,out int tmp)?(int?)tmp:null;` (15认同)
  • @JonSkeet值得注意的,我认为,当你的代码完全一致的提问问什么(因为它是关于一个循环/休息状态最有可能的),如果有人试图在非循环情景,他们将结束与天真地适应这个在strValue无法解析为int的情况下,0为intVal而不是`null`.当然,您不应仅仅因为接受了答案而复制/粘贴互联网^ _ ^. (7认同)
  • @ShaktiPrakashSingh:我们不知道`strValue`是否可以为null.如果它来自文本框,它可能*不能*为空.我的代码并不试图解决这个问题,但我们真的不知道它是否应该*解决它. (5认同)

buc*_*ley 21

无法阻止自己生成通用版本.用法如下.

    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);
Run Code Online (Sandbox Code Playgroud)


Jer*_*ing 5

您可以创建一个帮助方法来解析可以为null的值.

用法示例:

int? intVal;
if( !NullableInt.TryParse( "42", out intVal ) )
{
    break;
}
Run Code Online (Sandbox Code Playgroud)

助手方法:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)


Kje*_*sen 5

您也可以为此目的制作扩展方法;

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经把它作为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));
}
Run Code Online (Sandbox Code Playgroud)

缺点是这与解析值的框架语法不一致;

int.TryParse(input, out output))
Run Code Online (Sandbox Code Playgroud)

但我喜欢它的较短版本(是否更具可读性可能会受到讨论);

input.TryParse(out output)
Run Code Online (Sandbox Code Playgroud)