سؤال

سلسلة للبناء باستخدام 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());

بالنظر إلى أننا لسنا نلتزم بسلسلة واحدة كبيرة (نحن ننتج العديد من السلاسل الصغيرة) لا تنفذ أي عقوبات أداء في هذه الحالة. وفي سلاسل .NET طول البادئة على أي حال، وبالتالي فإن مشكلة أداء التسلسل بأكملها أقل صلة من C. String.join () بسرعة كبيرة أيضا، أسرع من StringBuilder.

TLDR: يستخدم String.Join()

نصائح أخرى

نلقي نظرة هنا: كيفية إنشاء سلسلة الاستعلام لعنوان URL في C #؟; ؛ نقلا عن:

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

إنها مجرد وسيلة لإعداد وقبل كل زوج بخلاف الأول دون استخدام اختبار شرطي.

إذا كنت ترغب في استخدام فكرتك الأصلية من تقليم StringBuilder بالمناسبة، أود أن أقترح الكود التالي بدلا من ذلك:

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

أميل إلى استخدام هذا، باستخدام حقيقة أنه يمكنك اقتطاع منشئ سلسلة مع انخفاض في خاصية الطول:

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);
} 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top