10
votes

Un moyen élégant de construire la chaîne en C #

chaîne pour accumuler à l'aide de KeyValuePair est comme ceci: "Nom1 = V1 & nom2 = v2 & nom3 = v3"

Qu'est-ce que je fais: p>

var sb = new StringBuilder();

foreach (var name in nameValues)
{
            sb.AppendFormat("{0}={1}&", name.Key, name.Value);
 } 

//remove last '&' sign, this is what i think is ugly
sb.ToString().Remove(lastIndex);


1 commentaires

Je pense que c'est la meilleure façon dont vous faites, cela évitera des contrôles supplémentaires pour chaque itération présentée ci-dessous.


7 Réponses :


1
votes

Bien au moins Vous pouvez supprimer le panneau & avant le Tostring () appeler en faisant - Sb.length;


0 commentaires

4
votes
foreach (var name in nameValues)
    {
        if (sb.Length > 0) sb.Append("&");
                sb.AppendFormat("{0}={1}", name.Key, name.Value);
     }
Just add "&" when needed, do not remove it from end.

1 commentaires

Et si la vitesse est une préoccupation, utilisez SB.Append (nom_quipe) .append ("="). Ajoutez (nom.value);



5
votes

3 commentaires

Cuil! Cela aura plus de frais si accessible en tant que méthode d'extension.


Existe-t-il une nomeurocollection qui peut contenir une chaîne, une paire d'objets?


Vous ne pouvez pas utiliser un dictionnaire ?



0
votes
var sb = new StringBuilder();

sb.AppendFormat("{0}={1}", nameValues[0].Key, nameValues[0].Value);

for (int i = 1; i < nameValues.Count; i++)
{
        sb.AppendFormat("&{0}={1}", nameValues[i].Key, nameValues[i].Value);
} 

1 commentaires

Petite typo sur la première appendormat - il n'a pas besoin de "&". Cette méthode fonctionne bien s'il est garanti d'au moins une entrée.



3
votes

Voici une autre approche que j'ai parfois utilisée: xxx pré>

C'est juste un moyen de préparer et avant chaque paire autre que le premier sans utiliser de test conditionnel. P> Si vous souhaitez utiliser votre idée originale de couper le StringBuilder CODE> d'ici comment, je suggère le code suivant à la place: P>

sb.Length--; // Remove the last character
return sb.ToString();


1 commentaires

Vous pouvez aussi utiliser "& {0} = {1}" et bander premier caractère avec un Sb.Tostring (1, Sb.Length - 1 )



18
votes
var joined =
    String.Join("&", nameValues.Select(n => n.Key + "=" + n.Value).ToArray());
Given that we're not concatenating to one big string (we're producing many small strings) concatenation carries no performace penalties in this case. And in .NET strings are length prefixed anyway so the whole concatenation performance issue is less relevant than in C. String.Join() is very fast as well, faster than StringBuilder.TLDR: Use String.Join()

2 commentaires

Vous avez oublié le "n =>" dans la sélection. var joind = string.join ("&", namevalues.select (n => string.concat (N.Key, "=", N.Value)). Toarray ());


Hélium: Oui, je sais que je l'ai réparé. Je ne suis pas encore réveillé à 100%.



3
votes

J'ai tendance à utiliser ceci, en utilisant le fait que vous pouvez tronquer un constructeur de chaîne avec une décrément de la propriété de longueur: xxx


0 commentaires