• StringBuilder拼接字符串,“,”在前还是在后问题


    在用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)
    {
    List<string> list = new List<string> { "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);
    }
    }


    我发现,AppendFormat()明显比Append()要快,而多次调用Append(),要比再其中拼接字符串更快,但是AppendFormat()显然可读性更好一些,怎么写还是看个人喜好,毕竟当性能没有出现问题时,性能问题永远不是问题,呵呵。

    作者:MeteorSeed

    感谢您阅读本文,如果您觉得有所收获,麻烦点一下右边的“推荐”,您的支持是对我最大的鼓励...

    转载请注明出处。

  • 相关阅读:
    字符串右移n位(C++实现)
    字符串反转实现(C++)
    MSDN无法显示该页的解决办法
    设计模式——单例模式 (C++实现)
    设计模式——工厂模式 (C++实现)
    设计模式课程 设计模式精讲 24-2 中介者模式coding
    设计模式课程 设计模式精讲 25-1 责任链模式讲解
    设计模式课程 设计模式精讲 23-3 命令模式源码解析
    设计模式课程 设计模式精讲 23-2 命令模式coding
    设计模式课程 设计模式精讲 22-3 备忘录模式源码解析
  • 原文地址:https://www.cnblogs.com/MeteorSeed/p/2250014.html
Copyright © 2020-2023  润新知