C# 胰蛋白酶合成糖

C# 胰蛋白酶合成糖,c#,asp.net,.net-4.0,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 : stringV

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

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

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

可能使用扩展方法:

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

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

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


Int.TryParse()已经是一个快捷方式,因此您不必测试有效的Int,而是分两步执行赋值。。。这就是您想要的。

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

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

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()),但如果您将其作为整数参数传递,则不需要强制转换,我将由此创建一个扩展方法

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

        return null;
    }
看看这个班。它包含一个扩展方法,该方法将尝试转换字符串,如果不成功,则使用提供的Int32值作为默认值填充该字符串

例如:

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

你需要有
System.Web.WebPages
名称空间。

这个答案只适用于那些至少使用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:

这个九年问题的最后一个补充:)。Bool解析有点不同,因为如果解析失败,您不希望返回默认值,而是希望返回NULL。这一行是这样做的(我认为从C#7开始):


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

Nice。当然,唯一的问题是,您无法区分输入字符串中的坏值和0。。。它剥夺了使用TryParse()的意义@James:我不同意。。。这取决于上下文。那么,如果用户在需要int的文本框中输入“gobbledygook”,您想改用“0”吗?或者你想告诉用户他们的错误,让他们纠正错误,以得到他们真正想要的结果吗?…aa我刚刚了解到,在声明变量的同一行中,可以使用变量作为“out”参数。谢谢这个代码怎么不吓唬人呢?我更喜欢@Reddog的扩展方法我想用int num=“123”.ToInt()添加与上面相同的解决方案;但是你跑得更快!对于这个get+1Whoa-whoaaaaaa,等等.Dump()是什么?它来自linqPad,抱歉。它只是把它打印到屏幕上。谢谢,但我不同意你所有的观点。它们根本不是真的。这是最好的解决方案,因为在一行中,我们得到了成功解析的值,我们仍然可以区分未解析的字符串和字符串“0”。默认情况下,我没有可访问的方法?!(.NETFramework4.5)虽然这次聚会有点晚了……我完全同意,将TryParse作为一行程序是很好的,但是这里的建议不是很好。C#6.0有一个语言提案,允许这种语法。。。bool result=int.TryParse(“123”,out int value);//value=123相关:如果要将int转换为int?您可以执行
int.TryParse(“字符串”,out int result)?result: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!");
}
return bool.TryParse(value, out bool result) ? (bool?)result : null;