web-dev-qa-db-ja.com

int.TryParse構文糖

int.TryPraseはすばらしいですが、問題は1つだけです...使用するには少なくとも2行のコードが必要です。

int intValue;
string stringValue = "123";
int.TryParse(stringValue, out intValue);
....

もちろん、私は次のようなことをすることができます:

string stringValue = "123";
int intValue = Convert.ToInt32(string.IsNullOrWhiteSpace(stringValue) ? 0 : stringValue); 

たった1行のコードで。

int.TryParseで1つのライナーを使用するための魔法をどのように実行できますか、それとも3つ目の選択肢がありますか?

ありがとう!

Bezdenが質問に最もよく答えましたが、実際にはReddogsソリューションを使用する予定です。

45
O.O
int intValue = int.TryParse(stringValue, out intValue) ? intValue : 0;
71
Vlad Bezden

多分拡張メソッドを使用します:

public static class StringExtensions
{
    public static int TryParse(this string input, int valueIfNotConverted)
    {
        int value;
        if (Int32.TryParse(input, out value))
        {
            return value;
        }
        return valueIfNotConverted;
    }
}

そして使い方:

string x = "1234";
int value = x.TryParse(0);

編集:そしてもちろん、デフォルト値をゼロに設定する明らかなオーバーロードを追加することもできます。

41
Reddog

この回答は、C#7以上を使用する人のみを対象としています。

これで、outパラメーターをインラインで宣言できます。

int.TryParse("123", out var result);

使用例:

if (int.TryParse("123", out var result)) {
    //do something with the successfully parsed integer
    Console.WriteLine(result);
} else {
    Console.WriteLine("That wasn't an integer!");
}

MSDN: https://docs.Microsoft.com/de-de/dotnet/csharp/whats-new/csharp-7#out-variables

15
Daniel Z.

これから拡張メソッドを作成します。

    public static int? AsInt32(this string s)
    {
        int value;
        if (int.TryParse(s, out value))
            return value;

        return null;
    }
4
andleer
int val2 = "asd".AsInt(-1); 
//Output : -1
 int val3 = "123".AsInt(-1); 
//Output : 123

System.Web.WebPages名前空間が必要です。

1
CodePunk

私は本当に美しいものはないと思いますが、これが好きなら、あなたはそれを1行にまとめます:

string stringValue = "123"
int intValue = int.TryParse(stringValue, out intValue) ? intValue : 0;
1
Tomas Jansson

StringExtensions クラスを確認してください。これには、文字列を変換しようとする AsInt(String、Int32) 拡張メソッドが含まれており、失敗した場合は、デフォルトとして指定されたInt32値を入力します。

例:

var intValue = "123".AsInt(-1);
1
CheckRaise

Int.TryParse()を1行にする必要はありません。どうして?入力文字列が有効な整数でない場合、intValueへの割り当てを行うことができないためです。 TryParse()の重要な点は、例外をキャッチするのではなく、適切な入力をテストして適切にデグレードできるようにすることです。

Int.TryParse()は既にショートカットであるため、有効なintをテストして2つのステップで割り当てを行う必要はありません...やりたい限りです。

0
James King

これは基本的に2つの値(成功と値)を返すため、実際には2つの行が必要です。

あなたはラッパークラスを試すことができます、すなわち:

void Main()
{
    var result = simpleIntParser.TryParse("1");
    if(result)
    {
        Console.WriteLine((int)result);
    } else {
        Console.WriteLine("Failed");
    }

    result = simpleIntParser.TryParse("a");
    if(result)
    {
        Console.WriteLine((int)result);
    } else {
        Console.WriteLine("Failed");
    }


}

public class simpleIntParser
{
    public bool result {get; private set;}
    public int value {get; private set;}

    private simpleIntParser(bool result, int value)
    {
        this.result = result;
        this.value = value;
    }

    public static simpleIntParser TryParse(String strValue)
    {
        int value;
        var result = int.TryParse(strValue, out value);
        return new simpleIntParser(result, value);
    }

    public static implicit operator int(simpleIntParser m)
    {
        return m.value;
    }

    public static implicit operator bool(simpleIntParser m)
    {
        return m.result;
    }
}

型があいまいな場合(つまり、Console.WriteLine()の場合)はキャストが必要ですが、たとえば整数パラメーターとして渡すと、キャストは不要です。

0
Rob