.Trim() を使用する必要がある文字列がたくさんありますが、null にすることができます。次のようなことができれば、はるかに簡潔になります。
string endString = startString !?? startString.Trim();
基本的に、左側の部分が null でない場合は右側の部分を返し、それ以外の場合は null 値を返すだけです。三項演算子を使用することになりましたが、この目的で null 合体演算子を使用する方法はありますか?
.Trim() を使用する必要がある文字列がたくさんありますが、null にすることができます。次のようなことができれば、はるかに簡潔になります。
string endString = startString !?? startString.Trim();
基本的に、左側の部分が null でない場合は右側の部分を返し、それ以外の場合は null 値を返すだけです。三項演算子を使用することになりましたが、この目的で null 合体演算子を使用する方法はありますか?
null
値をトリミングしようとすると戻る拡張メソッドを作成できます。
public String TrimIfNotNull(this string item)
{
if(String.IsNullOrEmpty(item))
return item;
else
return item.Trim();
}
拡張メソッドはインスタンス メソッドをオーバーライドできないため、Trim という名前を付けることはできないことに注意してください。
仕様ではありません:好きというわけではありませんが、以下を使用できます:
string endString = (startString ?? String.Empty).Trim();
仕様としては、@Kevin のような拡張メソッドの方が適しています。
string endString = (startString == null ? null : startString.Trim());
string endString = string.IsNullOrEmpty(startString) ? startString : startString.Trim();
私はまた、このレシピを毎回使用する代わりに、1 つのメソッドで説明していることを行う「safeTrim」と呼ばれる文字列拡張メソッドを作成するルートをたどりました。コードに対するKevin の応答を確認してください。
編集:うわー、私はそれをあらゆる種類の後方、間違った名前の変数、逆の三項演算子を持っていました.
C# 6.0 (.NET Framework 4.6 / Visual Studio 2015) 以降では、null 条件付きメンバー アクセスを使用できます。
string? endString = startString?.Trim();
ネクロマンシーで申し訳ありませんが、私はこれと同じ問題を抱えていて、ラムダ操作を使用してこれを解決しました。それは最も美しいわけではありませんが、私のコードを簡潔に保ちます。
残念なことに、C#は静的インポートや個々の関数のインポートをサポートしていませんが、とにかく:
この関数をどこかで定義します。
private static TResult N<TParent,TResult>(TParent parent, Func<TParent,TResult> operation) {
if( parent == null ) return default(TResult);
return operation( parent );
}
次に、例でそれを使用するには:
String endString = N(startString, s => s.Trim());
このN
関数はnull
、最初の引数がnullの場合に戻ります。それ以外の場合は、引数として値を使用して、指定されたラムダ関数を評価します。
もちろん、そのようにネストすることもできます。たとえば、長いチェーンを安全に逆参照するには、たとえば
String someValue = someObject.SomeProperty.SomeOtherProperty.SomeMethod().SomeFinalProperty;
これらのプロパティまたはメソッドのいずれかがnullを返す場合は、どこにでもnullチェックを挿入する必要があります。または、次のようにすることができます。
String someValue = N(N(N(N(someObject, o => o.SomeProperty), o => o.SomeOtherProperty), o => o.SomeMethod()), o => o.SomeFinalProperty);
私が言ったように、それは最もきれいではありません:)
次のようN
に、の拡張メソッドを作成することで、これを単純化できます。System.Object
String someValue = someObject.N( o => o.SomeProperty ).N( o => o.SomeOtherProperty ).N( o => o.SomeMethod() ).N( o => o.SomeFinalProperty );
...これはかなりきれいだと思います。
使用する
string endString = (startString ?? "").Trim();
startString が null の場合、これは空の文字列を使用します。ただし、これは null の場合は null を返しませんendString
。
2021 年に早送りします
。10 年後startString?.Trim()
の方が確実に良い選択肢です。そして、これは戻りnull
ます。
以下は null を伝播しませんが、null をパラメーターとして受け入れ、その場合は空の文字列を返します。
using Microsoft.VisualBasic; // you need to add a reference to Microsoft.VisualBasic.dll
...
string endString = Strings.Trim(startString);
...
ダック&ラン...
補足として、.NET 4 を使用している場合は、新しい便利な方法String.IsNullOrWhiteSpace
を使用できます。