18

.Trim() を使用する必要がある文字列がたくさんありますが、null にすることができます。次のようなことができれば、はるかに簡潔になります。

string endString = startString !?? startString.Trim();

基本的に、左側の部分が null でない場合は右側の部分を返し、それ以外の場合は null 値を返すだけです。三項演算子を使用することになりましたが、この目的で null 合体演算子を使用する方法はありますか?

4

8 に答える 8

13

null値をトリミングしようとすると戻る拡張メソッドを作成できます。

public String TrimIfNotNull(this string item)
{
   if(String.IsNullOrEmpty(item))
     return item;
   else
    return item.Trim();
}

拡張メソッドはインスタンス メソッドをオーバーライドできないため、Trim という名前を付けることはできないことに注意してください。

于 2010-05-17T21:20:47.817 に答える
12

仕様ではありません:好きというわけではありませんが、以下を使用できます:

string endString = (startString ?? String.Empty).Trim();

仕様としては、@Kevin のような拡張メソッドの方が適しています。

string endString = (startString == null ? null : startString.Trim());
于 2010-05-17T21:19:57.423 に答える
4
string endString = string.IsNullOrEmpty(startString) ? startString : startString.Trim();

私はまた、このレシピを毎回使用する代わりに、1 つのメソッドで説明していることを行う「safeTrim」と呼ばれる文字列拡張メソッドを作成するルートをたどりました。コードに対するKevin の応答を確認してください。

編集:うわー、私はそれをあらゆる種類の後方、間違った名前の変数、逆の三項演算子を持っていました.

于 2010-05-17T21:19:28.300 に答える
3

C# 6.0 (.NET Framework 4.6 / Visual Studio 2015) 以降では、null 条件付きメンバー アクセスを使用できます。

 string? endString = startString?.Trim();
于 2018-07-27T19:01:50.740 に答える
1

ネクロマンシーで申し訳ありませんが、私はこれと同じ問題を抱えていて、ラムダ操作を使用してこれを解決しました。それは最も美しいわけではありませんが、私のコードを簡潔に保ちます。

残念なことに、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 );

...これはかなりきれいだと思います。

于 2013-02-18T06:22:57.663 に答える
0

使用する

string endString = (startString ?? "").Trim();

startString が null の場合、これは空の文字列を使用します。ただし、これは null の場合は null を返しませんendString

2021 年に早送りします
。10 年後startString?.Trim()の方が確実に良い選択肢です。そして、これ戻りnullます。

于 2010-05-17T21:19:47.597 に答える
-1

以下は null を伝播しませんが、null をパラメーターとして受け入れ、その場合は空の文字列を返します。

using Microsoft.VisualBasic;  // you need to add a reference to Microsoft.VisualBasic.dll

    ...
    string endString = Strings.Trim(startString);
    ...

ダック&ラン...

于 2010-05-17T21:31:16.727 に答える
-1

補足として、.NET 4 を使用している場合は、新しい便利な方法String.IsNullOrWhiteSpaceを使用できます。

于 2010-05-17T21:37:36.913 に答える