75

それを使用するたびにTryParse、やや醜いコードになると感じています。主に私はこのように使用しています:

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

すべての基本的なデータ型を解析するためのより洗練されたソリューションはありますか?具体的には、フェイルセーフな解析を 1 行で行う方法はありますか? フェイルセーフにより、解析が例外なく失敗した場合にデフォルト値を設定することを前提としています。

ちなみに、これは解析に失敗しても何らかのアクションを起こさなければならない場合のためで、デフォルト値のままです。

4

8 に答える 8

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# 構文を 1 行で使用します。

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 にはちょっとした便利な機能Declaration expressionsがあるため、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 に答える
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));
}

構造体に制約Tして使用することNullableもできます(@skarmatsの回答に従って)。

于 2012-05-21T22:05:22.263 に答える
0

これは、F# を試す C# 開発者にとってうれしい驚きの 1 つです。TryParse メソッドは、ブール値と値の両方を含むタプルを返します。

于 2015-06-22T12:01:15.717 に答える