優雅に構築することが可能となる文字列のクライアントまで、フルのc#
-
19-09-2019 - |
質問
文字列を使用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);
他のエレガントなの除去計算書'&'サイン?
解決
var joined =
String.Join("&", nameValues.Select(n => n.Key + "=" + n.Value).ToArray());
されることはありません列を大文字列(い多くの小さな文字列)を連結しまないためperformace罰則ます。す。純文字列の長さの接頭辞が付くので、全体の連結パフォーマンスの問題が関連するよC.文字列になります。Join()あ、StringBuilder.
TLDR: 使用 String.Join()
他のヒント
こちらをご覧ください:どのように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]))));
}
foreach (var name in nameValues)
{
if (sb.Length > 0) sb.Append("&");
sb.AppendFormat("{0}={1}", name.Key, name.Value);
}
ただ、必要なときに「&」、終わりからは削除されません追加します。
ここで私は時々使用していた別のアプローチがあります:
var sb = new StringBuilder();
string prefix = "";
foreach (var name in nameValues)
{
sb.Append(prefix);
prefix = "&";
sb.AppendFormat("{0}={1}", name.Key, name.Value);
}
これは、条件テストを使用せずに最初の1以外のすべてのペアの前に前に付ける&だけの方法です。
あなたが道でStringBuilder
トリミングのあなたのオリジナルのアイデアを使用したい場合は、、私の代わりに、次のコードをお勧めます:
sb.Length--; // Remove the last character
return sb.ToString();
私はあなたがlengthプロパティに減少して文字列ビルダを切り捨てることができますことを利用し、これを使用する傾向があります
var sb = new StringBuilder();
foreach (var name in nameValues)
{
sb.AppendFormat("{0}={1}&", name.Key, name.Value);
}
if (sb.Length > 0) sb.Length--;
まあ、少なくともあなたは&
を行うことによってToString()
呼び出しの前に--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);
}
所属していません StackOverflow