2011-12-12 11 views
6

Cómo analizar cadena [] a cadena con espacios entre ¿Cómo podría refactorizar este código?Cómo combinar cadena [] a cadena con espacios entre

internal string ConvertStringArrayToString(string[] array) 
    { 
     StringBuilder builder = new StringBuilder(); 
     builder.Append(array[0]); 
     for (int i = 1; i < array.Length; i++) 
     { 
      builder.Append(' '); 
      builder.Append(array[i]); 
     } 
     return builder.ToString(); 
    } 
+3

Esto no es Analizar sino una forma de Combinar. –

Respuesta

22

Hay un método para que ya:

String.Join(" ", array) 

Esto pondrá un espacio entre cada elemento. Tenga en cuenta que si alguno de sus elementos son cadenas vacías, que va a terminar con espacios adyacentes entre sí, por lo que puede filtrar los antes de tiempo, así:

String.Join(" ", array.Where(s => !String.IsNullOrEmpty(s))) 
+3

"Parece excesivo ..." - eso no depende de cuán simple es, sino de la frecuencia con que se usa. Si es una unidad lógica, quieres una definición única. –

+1

@HenkHolterman: Sí, tienes razón, puede haber una razón para poner código trivial en un método solo para ponerle un nombre. – Guffa

+0

Como nota al margen, si un elemento del conjunto está vacío, terminará con dos espacios. A veces deseable, a veces no. 'String.Join (" ", array.Where (s =>! String.IsNullOrEmpty (s)))' eliminará espacios adicionales entre los elementos de su matriz. –

0

Usando LINQ Aggregate() método:

string result = array.Aggregate((acc, next) => acc + " " + next); 
+3

Tengo curiosidad por lo bien que esto funcionaría en comparación con el original, ya que parece asignar una carga de más objetos de cadena a medida que procesa. –

+0

Derecha, LINQ no es gratis. Creo que en este caso particular, String.Join sería una gran solución, por cierto, no pude ver String.Una implementación del reflector usign, sería muy interesante ver cómo se uniría, ya que las cadenas son inmutables, por lo que tal vez agregaría realizar en relativamente la misma complejidad de tiempo/memoria? – sll

+0

La implementación 'String.Join' probablemente descubra el tamaño de la cadena final al agregar la longitud de las cadenas en la matriz y los separadores, asigna un búfer de cadena, copia las cadenas y devuelve el búfer de cadena como cuerda. La solución 'Aggregate' en realidad tiene un rendimiento bastante malo en comparación, ya que copiará los mismos datos una y otra vez. Con cada elemento de matriz adicional, el tiempo de ejecución se duplica aproximadamente, de modo que si tiene una matriz larga, se volverá realmente lenta. – Guffa

2
internal string ConvertStringArrayToString(string[] array) 
{ 
    return string.Join(" ", array); 
} 

Por supuesto, es una tontería tener un método que simplemente llame a otro, así que puedes seguir todo el camino y eliminar por completo tu método ...

+0

Estoy de acuerdo con su declaración para esta situación, pero estoy en desacuerdo con la afirmación general "es una tontería tener un método que simplemente llama a otro". El reenvío de métodos es útil cuando se trata de cumplir con la Ley de Demeter, así como cuando se producen envoltorios alrededor de API de terceros, ya que cualquier cambio de rotura puede capturarse y manejarse en un solo lugar. – Lukazoid

+0

@Lukazoid. De acuerdo en que puede ser útil cuando se trata de API de terceros o también cuando se desean agregar condiciones previas al método por encima del suyo. –

Cuestiones relacionadas