9

有时我想连接两个字符串,中间有一个空格。但如果第二个字符串为空,我不想要空格。

考虑以下代码:

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

有没有更优雅的方法来做到这一点?

4

7 回答 7

25

这是我喜欢的一种选择。如果您已经拥有IEnumerable<string>数据会更好,但即使您没有,这也很容易。它还可以很好地扩展到连接的 n 个字符串,而不仅仅是 1 或 2 个。

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

这是另一种选择。对于这种情况,它有点短,但它更难看,更难阅读,而且没有那么可扩展,所以我个人可能会避免它:

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

在这种情况下,我们将空格添加到格式字符串本身,但如果message为空,我们将使用退格字符删除我们知道在消息中它之前的空格。

于 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());

当然,这会导致创建一些字符串对象,但这种微优化问题不太可能在绝大多数程序中产生影响。这种方法的一个优点可能被认为是它不仅处理空消息,还处理所有空格的消息。

于 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 回答
0

从 C#6 开始,您可以像这样使用字符串插值

$"Something is foo. {mssg}".TrimEnd();

在.NET Fiddle中查看

于 2021-02-25T20:42:06.793 回答
-5

最优雅的方法是使用 String 类的内置关键字。

String.IsNullOrEmpty

这样你就不会有问题了。

于 2012-09-25T17:52:16.043 回答