2012-09-25 10 views
8

Irgendwann möchte ich zwei Strings mit einem Leerzeichen dazwischen verbinden. Aber wenn die zweite Zeichenfolge null ist, möchte ich den Speicherplatz nicht.Add to string wenn string nicht leer

Erwägen folgenden Code:

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

Gibt es eine elegantere Möglichkeit, das zu tun?

Antwort

24

Hier ist eine Option, die ich mag. Es ist besser, wenn Sie bereits eine IEnumerable<string> mit Ihren Daten haben, aber es ist einfach genug, auch wenn Sie es nicht tun. Es skaliert auch gut zu n Strings, die verbunden werden, nicht nur 1 oder 2.

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

Hier ist eine weitere Option. Es ist ein bisschen kürzer für diesen einen Fall, aber es ist hässlicher, schwerer zu lesen, und nicht so erweiterbar, so würde ich es wahrscheinlich vermeiden persönlich:

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

In diesem Fall werden wir den Raum mit dem Format-String selbst hinzufügen, aber wenn message null ist, verwenden wir stattdessen das Backspace-Zeichen, um den Raum, von dem wir wissen, davor in der Nachricht zu entfernen.

+0

ich der Auffassung, dass. Ich hätte gerne eine Option, um {0}, {1}, {2} zu verwenden, wenn es nötig ist. Es ist auch nicht lesbarer als das, was ich bereits habe. –

0

Versuchen Sie folgendes:

string joinedString = string.IsNullOrEmpty(message2) ? message1 : message1 + " " + message2; 
-5

Die eleganteste Art und Weise ist das eingebaute Schlüsselwort von String-Klasse zu verwenden.

String.IsNullOrEmpty 

Auf diese Weise haben Sie nicht ein Problem.

+2

Dies beantwortet die Frage nicht. – stephen

1

Sicher, dies wird in ein paar String Objekt Kreationen führen, aber es ist unwahrscheinlich, dass solche Mikro-Optimierungsprobleme in der überwiegenden Mehrheit der Programme von Bedeutung sind. Es kann als ein Vorteil dieser Methode angesehen werden, dass sie nicht nur eine Null-Nachricht, sondern auch eine Nachricht von allen Whitespaces behandelt.

0

Für neuere Versionen von C# Sie folgende Erweiterungsmethode verwenden können:

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

Es kann wie folgt verwendet werden:

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