2010-09-04 6 views
5

J'ai besoin de convertir une collection de <string,string> en une seule chaîne contenant toutes les valeurs de la collection comme KeyValueKeyValue ... Mais comment le faire efficacement?meilleure façon de convertir la collection en chaîne

Je l'ai fait de cette façon au moment:

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

Mais pas sûr qu'il est la meilleure façon de le faire, un constructeur de chaîne serait mieux? Je suppose que la collection contiendra un maximum de 10 paires.

+1

Votre chemin est plutôt joli et compact. – tidwall

Répondre

4

Avec une telle petite collection, il n'y a pas beaucoup de problèmes de performance, mais j'utiliserais probablement un StringBuilder pour ajouter toutes les valeurs.

Comme ceci:

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

Mais cela ne fait que dupliquer ce que 'string.Join' fait en interne (l'OP semble être sur .NET 4.0, donc il a accès à la surcharge qui accepte un' IEnumerable '). –

0

Le constructeur de chaîne serait bien. Utilisez append pour ajouter chaque chaîne au constructeur de chaîne. Fondamentalement, la seule raison pour laquelle concat, remplacer, joindre, chaîne + chaîne, etc sont considérés comme pas le meilleur parce qu'ils ont tous tendance à détruire la chaîne en cours & recréer un nouveau. Donc, lorsque vous ajoutez des chaînes de 10 à 12 fois, cela signifie que vous détruisez & pour recréer une chaîne plusieurs fois.

5

string.Join utilisé pour ne pas vraiment être la meilleure option car elle n'accepte string[] ou object[] paramètres, ce qui nécessite que toutes les requêtes select -style devaient être complètement évalués et mis dans un tableau premier .

4.0 .NET apporté avec elle an overload that accepts IEnumerable<string> - qui est ce que vous utilisez - et même an overload that accepts any IEnumerable<T>. Ce sont certainement vos meilleurs choix car ils font maintenant partie de la BCL.

Par ailleurs, la fissuration ouvrir la source pour la première surcharge Reflector montre le code qui suit à peu près à 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 d'autres termes, si vous deviez changer ce code pour utiliser un StringBuilder, vous Je vais juste réécrire ce que MS a déjà écrit pour vous.

Questions connexes