10

keyvaluepair を使用して構築する文字列は次のようになります: "name1=v1&name2=v2&name3=v3"

私がしていること:

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

「&」記号の最後の削除ステートメントを回避するエレガントな方法はありますか?

4

7 に答える 7

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

1 つの大きな文字列に連結していない (多くの小さな文字列を生成している) ことを考えると、この場合、連結によってパフォーマンスが低下することはありません。とにかく.NET文字列には長さのプレフィックスが付けられるため、連結パフォーマンスの問題全体はCよりも関連性が低くなります。String.Join()も非常に高速で、StringBuilderよりも高速です。

TLDR:使用String.Join()

于 2010-01-06T11:04:50.583 に答える
5

こちらをご覧ください: C# で URL のクエリ文字列を作成する方法? ; 引用:

private string ToQueryString(NameValueCollection nvc)
{
    return "?" + 
        string.Join("&", 
            Array.ConvertAll(
                nvc.AllKeys, 
                key => String.Format("{0}={1}", HttpUtility.UrlEncode(key),
                HttpUtility.UrlEncode(nvc[key]))));
}
于 2010-01-06T11:01:44.233 に答える
4
foreach (var name in nameValues)
    {
        if (sb.Length > 0) sb.Append("&");
                sb.AppendFormat("{0}={1}", name.Key, name.Value);
     }

必要に応じて「&」を追加するだけで、末尾から削除しないでください。

于 2010-01-06T11:01:10.460 に答える
3

私が時々使用した別のアプローチを次に示します。

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

これは、条件付きテストを使用せずに、最初のペア以外のすべてのペアの前に & を追加する方法にすぎません。

ちなみに、トリミングの元のアイデアを使用したい場合はStringBuilder、代わりに次のコードをお勧めします。

sb.Length--; // Remove the last character
return sb.ToString();
于 2010-01-06T11:04:02.423 に答える
3

長さプロパティのデクリメントで文字列ビルダーを切り捨てることができるという事実を利用して、私はこれを使用する傾向があります。

var sb = new StringBuilder();

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

if (sb.Length > 0) sb.Length--;
于 2010-01-06T11:15:51.383 に答える
1

少なくとも、次のようにして呼び出しの&前に記号を削除できますToString()--sb.Length;

于 2010-01-06T11:00:11.367 に答える
0
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);
} 
于 2010-01-06T11:01:44.250 に答える