9

間にスペースを入れて 2 つの文字列を結合したい場合があります。しかし、2 番目の文字列が null の場合、スペースは必要ありません。

次のコードを検討してください。

void AssertFoo(bool cond, string message = null) {
    ...
    Assert.Fail("Something is foo.{0}", message != null ? " " + message : "");
    ...
}

それを行うよりエレガントな方法はありますか?

4

7 に答える 7

25

これが私が好きなオプションの1つです。すでにデータを持っている方が良いですが、IEnumerable<string>持っていなくても十分簡単です。また、1 つまたは 2 つだけでなく、n 個の文字列が結合されるようにスケーリングすることも明らかです。

string[] myStrings = new string[]{"Hello", "World", null};
string result = string.Join(" ", myStrings.Where(str => !string.IsNullOrEmpty(str)));

ここに別のオプションがあります。この1つのケースでは少し短くなっていますが、見にくく、読みにくく、拡張性がないため、個人的には避けたいと思います:

//note space added before {0}
Assert.Fail("Something is foo. {0}", message ?? "\b");

この場合、フォーマット文字列自体にスペースを追加しますが、messageが null の場合は、代わりにバックスペース文字を使用して、メッセージ内のその前にあることがわかっているスペースを削除します。

于 2012-09-25T17:51:23.247 に答える
3

C# の新しいバージョンでは、次の拡張メソッドを使用できます。

public static string Prepend(this string value, string prepend) => prepend + value;

次のように使用できます。

Assert.Fail("Something is foo.{0}", message?.Prepend(" "));

2020年に追加:

今日、私はこれを使用します:

public static string Surround(this object value, string prepend, string append = null) => prepend + value + append;
于 2017-12-01T15:13:56.343 に答える
1
Assert.Fail("Something is foo.{0}", (" " + message).TrimEnd());

確かに、これによりいくつかの文字列オブジェクトが作成されますが、そのようなマイクロ最適化の問題が大多数のプログラムで問題になることはまずありません。null メッセージだけでなく、すべて空白のメッセージも処理できることは、このメソッドの利点と考えられます。

于 2012-09-25T17:59:32.593 に答える
0

これを試して:

string joinedString = string.IsNullOrEmpty(message2) ? message1 : message1 + " " + message2;
于 2012-09-25T17:51:40.560 に答える
0
Assert.Fail("Something is foo.{0}", message?.PadLeft(message.Lenght + 1, ' '));
于 2021-03-09T03:52:28.677 に答える
-5

最も洗練された方法は、String クラスの組み込みキーワードを使用することです。

String.IsNullOrEmpty

この方法で問題が発生することはありません。

于 2012-09-25T17:52:16.043 に答える