75

我觉得每次我使用TryParse它都会导致代码有些难看。主要是我这样使用它:

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

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

顺便说一句,这是针对即使解析失败也必须执行某些操作的情况,只需使用默认值即可。

4

8 回答 8

198

这是有效的,如果您喜欢单线,您可能会更喜欢它:

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

如果无法解析字符串,则设置 的值i,否则设置。42si = i

于 2013-09-24T11:01:22.803 回答
23

直接扩展方法怎么样?

public static class Extensions
{
    public static int? TryParse(this string Source)
    {
        int result;
        if (int.TryParse(Source, out result))
            return result;
        else

            return null;
    }
}

或者在一行中使用新的 c# 语法:

public static int? TryParse(this string Source) => int.TryParse(Source, out int result) ? result : (int?)null;

用法:

v = "234".TryParse() ?? 0
于 2012-05-21T22:07:05.870 回答
14

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

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

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

或在线指定默认值:

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

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

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

于 2012-05-21T22:03:45.640 回答
13

C# 6 C# 7中有一个不错的小功能,声明表达式,所以在 C# 7 中,而不是:

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

我们可以用:

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

对我来说足够好:)

于 2014-07-03T14:28:01.893 回答
4

在单行中使用 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;
}
于 2019-03-05T11:38:11.277 回答
3

在您的特定示例中,您可以这样做:

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

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

于 2012-05-21T22:09:19.423 回答
1

您可以改用 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));
}

您也可以限制Tstruct 和 use Nullable(根据@skarmats 的回答)。

于 2012-05-21T22:05:22.263 回答
0

这是尝试 F# 的 C# 开发人员的惊喜之一。TryParse 方法返回一个包含布尔值和值的元组。

于 2015-06-22T12:01:15.717 回答