将字符串解析为可以为空的数字类型(1或2个字符串)

Dan*_*Dan 18 .net c#

脚本

将字符串解析为可以为null的数字类型.如果解析不成功,则结果应为null; 否则结果应该是解析的值.

为了实现这一点,我总是使用以下简单但冗长的烦人方法:

string numericString = "...";

decimal? numericValue;
decimal temp;
if (decimal.TryParse(numericString, out temp))
{
    numericValue = temp;
}
else
{
    numericValue = null;
}
Run Code Online (Sandbox Code Playgroud)

我使用上面的方法,因为以下不编译:

decimal temp;
decimal? numericValue = decimal.TryParse(numericString, out temp) ? temp : null;
Run Code Online (Sandbox Code Playgroud)

有没有人知道第一位代码的版本与第二位一样短,整齐,可读?我知道我总是可以写一个封装第一段代码的扩展方法,但我想知道是否有任何方法可以在没有扩展方法的情况下做我想做的事情.

Ond*_*cny 35

一个简单的显式类型转换使其可编译:

decimal temp;
// typecast either 'temp' or 'null'
decimal? numericValue =
  decimal.TryParse(numericString, out temp) ? temp : (decimal?)null;
Run Code Online (Sandbox Code Playgroud)

另一种选择是default在期望的可空类型上使用运算符:

decimal temp;
// replace null with default
decimal? numericValue =
  decimal.TryParse(numericString, out temp) ? temp : default(decimal?);
Run Code Online (Sandbox Code Playgroud)

  • 我宁愿使用`default(decimal?)`,我觉得它比演员更具可读性...... (3认同)

Lee*_*Lee 12

我会做这样的事情:

public delegate bool TryParseDelegate<T>(string str, out T value);

public static T? TryParseOrNull<T>(TryParseDelegate<T> parse, string str) where T : struct
{
    T value;
    return parse(str, out value) ? value : (T?)null;
}

decimal? numericValue = TryParseOrNull<decimal>(decimal.TryParse, numericString);
Run Code Online (Sandbox Code Playgroud)

或者你可以把它变成一个扩展方法:

public static T? TryParseAs<T>(this string str, TryParseDelegate<T> parse) where T : struct
{
    T value;
    return parse(str, out value) ? value : (T?)null;
}

decimal? numericValue = numericString.TryParseAs<decimal>(decimal.TryParse);
Run Code Online (Sandbox Code Playgroud)

  • +1用于可用于`DateTime`,`bool`,`int`,`long`,`double`等的通用方法. (2认同)

Tho*_*que 6

只需将其分解为扩展方法:

public static decimal? ParseDecimal(this string s)
{
    decimal d;
    if (decimal.TryParse(s, out d))
        return d;
    return null;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它:

numericValue = numericString.TryParseDecimal();
Run Code Online (Sandbox Code Playgroud)


Cod*_*man 5

怎么样:

decimal? numericValue = 
    decimal.TryParse(numericString, out temp) ? temp : null as decimal?;
Run Code Online (Sandbox Code Playgroud)

null如果转换失败,这将生成 numericValue ,并且很好且干净。


Sam*_*amo 0

使用更新的 C# 功能的一个不错的衬里将是:

var numericValue = decimal.TryParse(numericString, out var temp) ? temp : default(decimal?);
Run Code Online (Sandbox Code Playgroud)