C#-诠释TryParse语法糖

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解决方案。

O.O asked 2020-07-27T03:28:33Z
9个解决方案
68 votes
int intValue = int.TryParse(stringValue, out intValue) ? intValue : 0;
Vlad Bezden answered 2020-07-27T03:29:41Z
40 votes

也许使用扩展方法:

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);

编辑:当然,您可以添加明显的过载,该过载已经将默认值设置为零。

Reddog answered 2020-07-27T03:30:09Z
14 votes

该答案仅适用于至少使用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]

Daniel Z. answered 2020-07-27T03:30:42Z
4 votes

我将基于此创建扩展方法。

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

        return null;
    }
andleer answered 2020-07-27T03:31:02Z
1 votes

我认为没有什么东西真的很漂亮,但是如果您喜欢这样,可以将其简化为一行:

string stringValue = "123"
int intValue = int.TryParse(stringValue, out intValue) ? intValue : 0;
Tomas Jansson answered 2020-07-27T03:31:23Z
1 votes

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

例:

var intValue = "123".AsInt(-1);
CheckRaise answered 2020-07-27T03:31:47Z
0 votes

您不希望将int.TryParse()设置为一行。 为什么? 因为如果输入字符串不是有效的整数,则无法为intValue赋值。 TryParse()的全部目的是允许您测试良好的输入并优雅地进行降级,而不必捕获异常。

Int.TryParse()已经是一种快捷方式,因此您不必测试有效的int并分两步进行赋值……就您所愿。

James King answered 2020-07-27T03:32:12Z
0 votes

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

您可以尝试包装器类,即:

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()),则需要强制转换,但是例如,如果将其作为整数参数传递,则不需要强制转换

Rob answered 2020-07-27T03:32:41Z
0 votes
int val2 = "asd".AsInt(-1); 
//Output : -1
 int val3 = "123".AsInt(-1); 
//Output : 123

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

CodePunk answered 2020-07-27T03:33:01Z
translate from https://stackoverflow.com:/questions/4620565/int-tryparse-syntatic-sugar