有时我想连接两个字符串,中间有一个空格。但如果第二个字符串为空,我不想要空格。
考虑以下代码:
void AssertFoo(bool cond, string message = null) {
...
Assert.Fail("Something is foo.{0}", message != null ? " " + message : "");
...
}
有没有更优雅的方法来做到这一点?
有时我想连接两个字符串,中间有一个空格。但如果第二个字符串为空,我不想要空格。
考虑以下代码:
void AssertFoo(bool cond, string message = null) {
...
Assert.Fail("Something is foo.{0}", message != null ? " " + message : "");
...
}
有没有更优雅的方法来做到这一点?
这是我喜欢的一种选择。如果您已经拥有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
为空,我们将使用退格字符删除我们知道在消息中它之前的空格。
对于较新版本的 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;
Assert.Fail("Something is foo.{0}", (" " + message).TrimEnd());
当然,这会导致创建一些字符串对象,但这种微优化问题不太可能在绝大多数程序中产生影响。这种方法的一个优点可能被认为是它不仅处理空消息,还处理所有空格的消息。
尝试这个:
string joinedString = string.IsNullOrEmpty(message2) ? message1 : message1 + " " + message2;
Assert.Fail("Something is foo.{0}", message?.PadLeft(message.Lenght + 1, ' '));
最优雅的方法是使用 String 类的内置关键字。
String.IsNullOrEmpty
这样你就不会有问题了。