在用StringBuilder拼接字符串时,经常使用分隔符,到底把分隔符放前面还是后面好呢?
我认为放前面好,因为StringBuilder在自己空间不够用的时候会成倍增加自己空间,这比较耗时。如果我把分隔符放前面,我就能在早期减少1个字符长度,如果放后面就只能最后去处理,没准就这1位就引起了它扩容。我能想象到的比较好的拼接方法如下,也请高手给出意见。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Listlist = new List { "aa", "bb", "cc" }; DateTime start = DateTime.Now; int l1 = 0, l2 = 0; for (int i = 0; i < 10000; i++) { StringBuilder sb = new StringBuilder(8);//8是估算出来的,这个长度影响性能,但也只能近似估算 foreach (var item in list) { sb.AppendFormat("{0},", item); } string a = sb.ToString(); l1 += sb.Capacity; } //输出所用时间 Console.WriteLine(l1.ToString() + "=" + (DateTime.Now - start)); start = DateTime.Now; for (int i = 0; i < 10000; i++) { StringBuilder sb2 = null; foreach (var item in list) { if (sb2 != null) { sb2.AppendFormat(",{0}", item); } else { sb2 = new StringBuilder(item, 8); } } string b2 = sb2.ToString(); l2 += sb2.Capacity; } Console.WriteLine(l2.ToString() + "=" + (DateTime.Now - start)); Console.ReadKey(); } } }
运行结果如下:
可见,就差1位也有不小的差距。
补充:最后,我测试了下,最快的方法我认为是如下所示代码:
StringBuilder sb3 = null; foreach (var item in list) { if (sb3 != null) { sb3.Append(","); sb3.Append(item); } else { sb3 = new StringBuilder(item, 8); } }