Question

chaîne pour construire à l'aide KeyValuePair est comme ceci: "nom1 = v1 & v2 = nom2 & NAME3 = v3"

ce que je fais:

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);

une façon élégante d'éviter la dernière déclaration de retrait de « & » signe?

Était-ce utile?

La solution

var joined =
    String.Join("&", nameValues.Select(n => n.Key + "=" + n.Value).ToArray());

Étant donné que nous ne sommes pas concaténer à une grande chaîne (nous produisons beaucoup de petites chaînes) concaténation porte aucune pénalité de performace dans ce cas. Et dans les chaînes .NET sont longueur préfixé de toute façon si la question de la performance de concaténation est moins pertinente que dans C. String.Join () est très rapide aussi bien, plus vite que StringBuilder.

TLDR: Utilisez String.Join()

Autres conseils

Jetez un coup d'oeil ici: Comment construire une chaîne de requête pour une URL en C # ?; Citant:

private string ToQueryString(NameValueCollection nvc)
{
    return "?" + 
        string.Join("&", 
            Array.ConvertAll(
                nvc.AllKeys, 
                key => String.Format("{0}={1}", HttpUtility.UrlEncode(key),
                HttpUtility.UrlEncode(nvc[key]))));
}
foreach (var name in nameValues)
    {
        if (sb.Length > 0) sb.Append("&");
                sb.AppendFormat("{0}={1}", name.Key, name.Value);
     }

Il suffit d'ajouter « et » en cas de besoin, ne supprime pas de fin.

Voici une autre approche que j'ai parfois utilisé:

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

Il est juste une façon de préfixer et avant chaque paire autre que le premier, sans l'aide d'un test conditionnel.

Si vous voulez utiliser votre idée originale de tailler la StringBuilder en passant, je vous suggère plutôt le code suivant:

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

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

var sb = new StringBuilder();

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

if (sb.Length > 0) sb.Length--;

Eh bien au moins, vous pouvez supprimer le signe & avant l'appel ToString() en faisant --sb.Length;

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);
} 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top