Frage

string KeyValuePair aufzubauen Verwendung ist wie folgt: "name1 = v1 & name2 = v2 & name3 = v3"

, was ich tue:

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

jede elegante Weise die letzte Entfernung Erklärung zu vermeiden ‚&‘ unterschreiben?

War es hilfreich?

Lösung

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

Da wir nicht zu einem großen Verketten (wir viele kleine Strings sind produzierend) Verkettung keine Performace Strafen in diesem Fall trägt. Und in .NET Strings werden Länge voran ohnehin so dass das ganze Verkettung Leistungsproblem ist weniger relevant als in C. String.Join () ist sehr schnell und schneller als String.

TLDR: Verwenden String.Join()

Andere Tipps

Schauen Sie hier: Wie baut eine Abfrage-Zeichenfolge für eine URL in C # ?; Zitiert:

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

Fügen Sie einfach „&“, wenn nötig, entfernen Sie es nicht von einem Ende.

Hier ist ein weiterer Ansatz, den ich manchmal verwendet habe:

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

Es ist nur ein Weg, vorangestellt wird und vor jedem Paar andere als die ersten ohne einen bedingten Test.

Wenn Sie Ihre ursprüngliche Idee verwenden möchten, durch die Art und Weise der StringBuilder Trimmen, würde ich den folgenden Code vorschlagen statt:

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

Ich neige dazu, dies zu nutzen, unter Verwendung der Tatsache Sie einen String-Builder mit einer Abnahme der Länge Eigenschaft verkürzen können:

var sb = new StringBuilder();

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

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

Nun, zumindest kann man das & Zeichen vor dem ToString() Aufruf entfernen, indem --sb.Length; tun

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);
} 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top