int.TryParse语法糖

时间:2011-01-06 22:19:03

标签: c# asp.net .net-4.0

int.TryPrase非常好,但只有一个问题......至少需要使用两行代码:

int intValue;
string stringValue = "123";
int.TryParse(stringValue, out intValue);
....

当然,我可以这样做:

string stringValue = "123";
int intValue = Convert.ToInt32(string.IsNullOrWhiteSpace(stringValue) ? 0 : stringValue); 

只需一行代码。

我怎样才能让int.TryParse使用一个内衬,或者还有第三种替代方法?

谢谢!

Bezden最好地回答了这个问题,但实际上我打算使用Reddogs解决方案。

11 个答案:

答案 0 :(得分:64)

int intValue = int.TryParse(stringValue, out intValue) ? intValue : 0;

答案 1 :(得分:38)

也许使用扩展方法:

public static class StringExtensions
{
    public static int TryParse(this string input, int valueIfNotConverted)
    {
        int value;
        if (Int32.TryParse(input, out value))
        {
            return value;
        }
        return valueIfNotConverted;
    }
}

用法:

string x = "1234";
int value = x.TryParse(0);

编辑:当然,如果您愿意,可以添加已将默认值设置为零的明显重载。

答案 2 :(得分:12)

此答案仅适用于使用至少C#7 的人。

您现在可以内联声明out参数。

int.TryParse("123", out var result);

示例用法:

if (int.TryParse("123", out var result)) {
    //do something with the successfully parsed integer
    Console.WriteLine(result);
} else {
    Console.WriteLine("That wasn't an integer!");
}

MSDN:https://docs.microsoft.com/de-de/dotnet/csharp/whats-new/csharp-7#out-variables

答案 3 :(得分:3)

我会创建一个扩展方法。

    public static int? AsInt32(this string s)
    {
        int value;
        if (int.TryParse(s, out value))
            return value;

        return null;
    }

答案 4 :(得分:1)

我认为没有什么东西真的很漂亮,但如果你喜欢这个,你可以把它归结为一行:

string stringValue = "123"
int intValue = int.TryParse(stringValue, out intValue) ? intValue : 0;

答案 5 :(得分:1)

查看StringExtensions课程。它包含一个AsInt(String,Int32)扩展方法,它将尝试转换字符串,如果不成功,则使用提供的Int32值作为默认值填充它。

示例:

var intValue = "123".AsInt(-1);

答案 6 :(得分:0)

你不想让int.TryParse()一行。为什么?因为如果输入字符串不是有效整数,则无法对intValue进行赋值。 TryParse()的重点是允许您测试良好的输入并优雅地降级,而不是必须捕获异常。

Int.TryParse()已经是一个快捷方式,因此您不必测试有效的int并分两步完成任务......就您想要的那样而言。

答案 7 :(得分:0)

因为它基本上返回两个值(成功和值),所以我们确实需要两行。

您可以尝试一个包装类,即:

void Main()
{
    var result = simpleIntParser.TryParse("1");
    if(result)
    {
        Console.WriteLine((int)result);
    } else {
        Console.WriteLine("Failed");
    }

    result = simpleIntParser.TryParse("a");
    if(result)
    {
        Console.WriteLine((int)result);
    } else {
        Console.WriteLine("Failed");
    }


}

public class simpleIntParser
{
    public bool result {get; private set;}
    public int value {get; private set;}

    private simpleIntParser(bool result, int value)
    {
        this.result = result;
        this.value = value;
    }

    public static simpleIntParser TryParse(String strValue)
    {
        int value;
        var result = int.TryParse(strValue, out value);
        return new simpleIntParser(result, value);
    }

    public static implicit operator int(simpleIntParser m)
    {
        return m.value;
    }

    public static implicit operator bool(simpleIntParser m)
    {
        return m.result;
    }
}

如果类型不明确(例如对于Console.WriteLine()),则需要强制转换,但如果将其作为整数参数传递,则不需要强制转换

答案 8 :(得分:0)

int val2 = "asd".AsInt(-1); 
//Output : -1
 int val3 = "123".AsInt(-1); 
//Output : 123

您需要System.Web.WebPages命名空间。

答案 9 :(得分:0)

这个第九个古老问题的最后一个补充:)。布尔解析有点不同,因为如果解析失败,您不想返回默认值,而是想返回NULL。这行代码是这样做的(从C#7开始,我认为):

return bool.TryParse(value, out bool result) ? (bool?)result : null;

必须对结果进行强制转换,否则它将无法调和两个返回值的不同类型。

答案 10 :(得分:0)

在 C# 7.0+ 中,您可以使用 inline variable declaration

  • 如果解析成功 - intValue = 其解析值。
  • 如果解析失败 - intValue = 0。

代码:

int.TryParse(stringValue, out int intValue);

缺点:

您无法区分 0 值和未解析的值。