优雅的TryParse

Ant*_*ula 48 c#

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

int value;
if (!int.TryParse(someStringValue, out value))
{
    value = 0;
}
Run Code Online (Sandbox Code Playgroud)

是否有一些更优雅的解决方案来解析所有基本数据类型,具体是有一种方法可以在一行中进行故障安全解析吗?通过故障保护我假设如果解析失败而没有异常,则设置默认值.

顺便说一句,这是针对我必须做一些操作的情况,即使解析失败,只需使用默认值.

dav*_*v_i 129

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

int i = int.TryParse(s, out i) ? i : 42;
Run Code Online (Sandbox Code Playgroud)

如果它无法解析字符串,则将值设置为ito ,否则设置为.42si = i

  • +1我必须承认我不知道它在一行中有效.我本可以发誓,至少VB.NET不喜欢它,但是:`Dim i As Int32 = If(Int32.TryParse("nonum",i),i,42)`.谢谢. (8认同)
  • 如果您想直接返回结果:`return int.TryParse(s, out int i) ? 我:42;` (5认同)
  • 如果你不使用dim/var,它可以工作. (3认同)
  • 我非常喜欢这个答案! (3认同)
  • 请注意,@BalintPogatsa 的更新版本需要 C# 7.0 (2认同)

use*_*107 18

直接扩展方法怎么样?

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

}
Run Code Online (Sandbox Code Playgroud)

用法:

v = "234".TryParse() ?? 0
Run Code Online (Sandbox Code Playgroud)

  • @AntonioBakula:是的,偏好总是很重要.但是,您不会在返回值上获得类型推断.因此,您将使用许多方法污染String-IntelliSense(每种类型对应一种要解析的方法) (5认同)

ska*_*ats 15

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

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

if (value == null)
{
    // not a number
}
else
{
    // use value.Value
}
Run Code Online (Sandbox Code Playgroud)

或者在线指定默认值:

int value = Maybe.ToInt("123") ?? 0;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 请提供您提到的 Maybe 类的链接 (2认同)

Ant*_*ula 13

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

int x;
if (int.TryParse("123", out x))
{
  DoSomethingWithX(x);
}
Run Code Online (Sandbox Code Playgroud)

我们可以用:

if (int.TryParse("123", out int x))
{
  DoSomethingWithX(x);
}
Run Code Online (Sandbox Code Playgroud)

对我来说太好了:)

  • 不幸的是,声明表达式没有为C#6做最后的削减. (7认同)
  • @EricSondergard它确实是一个情绪过山车. (4认同)
  • 这很好,但它仍然缺少默认值。在这里,我们只是避开了声明行。 (2认同)