2012-09-25 36 views
8

En algún momento quiero unir dos cadenas con un espacio intermedio. Pero si la segunda cadena es nula, no quiero el espacio.Agregar a la cadena si la cadena no está vacía

Considere el siguiente código:

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

¿Existe una forma más elegante de hacer eso?

Respuesta

24

Aquí hay una opción que me gusta. Es mejor si ya tiene un IEnumerable<string> con sus datos, pero es bastante fácil incluso si no lo hace. También se adapta bien a n cadenas unidas, no solo 1 o dos.

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

Aquí hay otra opción. Es un poco más corto para este único caso, pero es más feo, más difícil de leer, y no como extensible, por lo que probablemente evitarlo personalmente:

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

En este caso se añade el espacio para la propia cadena de formato, pero si message es nulo, en su lugar usamos el carácter de retroceso para eliminar el espacio que sabemos que está antes en el mensaje.

+0

que consideró que. Me gustaría tener una opción para usar {0}, {1}, {2} si es necesario. Tampoco es más legible que lo que ya tengo. –

0

Prueba esto:

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

La forma más elegante es usar la palabra clave incorporada de clase String.

String.IsNullOrEmpty 

De esta manera no tendrás un problema.

+2

Esto no responde la pregunta. – stephen

1
Assert.Fail("Something is foo.{0}", (" " + message).TrimEnd()); 

Sin duda, esto se traducirá en unas pocas creaciones objeto de cadena, pero es poco probable este tipo de problemas de optimización micro-importarían en la gran mayoría de los programas. Se podría considerar una ventaja de este método que maneja no solo un mensaje nulo, sino también un mensaje de todos los espacios en blanco.

0

hay nuevas versiones de C# se puede utilizar el siguiente método de extensión:

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

Puede ser utilizado como esto:

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