优雅的TryParse

时间:2012-05-21 21:58:22

标签: c#

我觉得每次使用TryParse时都会导致代码有点丑陋。主要是我这样使用它:

int value;
if (!int.TryParse(someStringValue, out value))
{
    value = 0;
}

是否有一些更优雅的解决方案来解析所有基本数据类型,具体是否有办法在一行中进行故障安全解析?如果失败安全,我假设如果解析失败而没有例外,则设置默认值。

顺便说一下,即使解析失败,我也必须做一些动作,只使用默认值。

8 个答案:

答案 0 :(得分:113)

这是有效的,如果你喜欢单行,你可能更喜欢它:

int i = int.TryParse(s, out i) ? i : 42;

如果无法解析字符串i,则会将42的值设置为s,否则会设置i = i

答案 1 :(得分:18)

直接扩展方法怎么样?

public class Extensions
{
    public static int? TryParse(string this Source)
    {
        if(int.tryparse .... 
    }

}

用法:

v = "234".TryParse() ?? 0

答案 2 :(得分:15)

您可以编写自己的方法,以获得更适合您的解决方案。我偶然发现了包含Maybe方法的TryParse类。

int? value = Maybe.ToInt("123");

if (value == null)
{
    // not a number
}
else
{
    // use value.Value
}

或指定默认值in-line:

int value = Maybe.ToInt("123") ?? 0;

观察Nullable<int> / int?int之间的区别。

有关详细信息,请参阅http://www.kodefuguru.com/post/2010/06/24/TryParse-vs-Convert.aspx

答案 3 :(得分:12)

C#6 C#7 Declaration expressions中有一个不错的小功能,所以在C#7而不是:

int x;
if (int.TryParse("123", out x))
{
  DoSomethingWithX(x);
}

我们可以使用:

if (int.TryParse("123", out int x))
{
  DoSomethingWithX(x);
}

对我来说足够好了:))

答案 4 :(得分:2)

您可以改为使用TypeDescriptor:

public T Convert<T>(string input, T defaultVal)
{
    var converter = System.ComponentModel.TypeDescriptor.GetConverter(typeof(T));
    if(converter != null)
    {
        return (T)converter.ConvertFromString(input);
    }
    return defaultVal;
}

public T Convert<T>(string input)
{
    return Convert(input, default(T));
}

你可以约束T构造并使用Nullable(根据@skarmats的回答)。

答案 5 :(得分:2)

在您的特定示例中,您可以执行此操作:

int value; 
int.TryParse(someStringValue, out value);

...因为如果解析失败,Int32.TryParse()被记录为设置value=0

答案 6 :(得分:0)

对于尝试使用F#的C#开发人员来说,这是一个不错的惊喜。 TryParse方法返回一个包含bool和值的元组。

答案 7 :(得分:0)

在单行中使用C#7

int.TryParse(s, out var i) ? i : (int?)null;

示例方法:

public static int? TryParseSafe(string s)
{
    return int.TryParse(s, out var i) ? i : (int?)null;
}