2010-09-04 27 views
5

Necesito convertir una colección de <string,string> en una sola cadena que contenga todos los valores de la colección como KeyValueKeyValue ... Pero ¿cómo hago esto de manera efectiva?mejor manera de convertir la colección a la cadena

que han hecho de esta manera en la actualidad

parameters = string.Join("", requestParameters.Select(x => string.Concat(x.Key, x.Value))); 

Pero no estoy seguro que es la mejor manera de hacerlo, sería un constructor de cadena ser mejor? Supongo que la colección contendrá un máximo de 10 pares.

+1

Su forma se ve muy bonita y compacta. – tidwall

Respuesta

4

Con una colección tan pequeña, no hay mucho de un problema de rendimiento, pero probablemente usaría un StringBuilder para anexar todos los valores.

De esta manera:

var sb = new Text.StringBuilder; 
foreach (var item in requestParameters) 
{ 
    sb.AppendFormat("{0}{1}", item.Key, item.Value); 
} 
var parameters = sb.ToString(); 
+1

Pero esto solo duplica lo que 'string.Join' hace internamente (el OP parece estar en .NET 4.0, por lo que tiene acceso a la sobrecarga que acepta un' IEnumerable '). –

0

El generador de cadenas estaría bien. Use append para agregar cada una de las cadenas al generador de cadenas.

Básicamente la única razón por la que concat, replace, join, string + string, etc. se consideran no los mejores, ya que todos tienden a destruir la cadena actual & recrear una nueva.

Así que cuando se han de añadir cadenas como hasta 10-12 tiempo de lo que realmente significa que va a destruir & recrear una cadena que en muchas ocasiones.

5

string.Join utilizarse en realidad no ser la mejor opción, ya que sólo se acepta o string[]object[] parámetros, lo que requiere que cualquier select consultas al estilo necesitaban ser completamente evaluado y puesto en una matriz primero .

.NET 4.0 trajo consigo an overload that accepts IEnumerable<string> - que es lo que está utilizando - e incluso an overload that accepts any IEnumerable<T>. Estas son definitivamente su mejor apuesta ya que ahora son parte del BCL.

Por cierto, el agrietamiento abrir el origen de la primera sobrecarga en Reflector muestra código que sigue muy de cerca a what davisoa suggested:

public static string Join(string separator, IEnumerable<string> values) 
{ 
    if (values == null) 
    { 
     throw new ArgumentNullException("values"); 
    } 
    if (separator == null) 
    { 
     separator = Empty; 
    } 
    using (IEnumerator<string> enumerator = values.GetEnumerator()) 
    { 
     if (!enumerator.MoveNext()) 
     { 
      return Empty; 
     } 
     StringBuilder builder = new StringBuilder(); 
     if (enumerator.Current != null) 
     { 
      builder.Append(enumerator.Current); 
     } 
     while (enumerator.MoveNext()) 
     { 
      builder.Append(separator); 
      if (enumerator.Current != null) 
      { 
       builder.Append(enumerator.Current); 
      } 
     } 
     return builder.ToString(); 
    } 
} 

En otras palabras, si tuviera que cambiar el código para utilizar un StringBuilder, se Estaría reescribiendo lo que MS ya escribió para ti.

Cuestiones relacionadas