none
StringBuilder.Replace()方法的效率问题 RRS feed

  • 问题

  • 比如我实例化了一个StringBuilder对象StringBuilder sb=new StringBuilder(),有一个方法sb.Replace(“label”,GetLabel()),而方法GetLabel()内部连接数据库,也就是说一个比较耗资源的方法,根据我的测试StringBuilder不论sb中是否存在"label",都会执行GetLabel()这个方法,这样无疑会造成资源的浪费,StringBuilder是否支持先判断是否存在要替换的内容,在决定是否要执行GetLabel()这个方法呢?还是必须在替换之前自己手动判断呢?

    2010年11月12日 5:51

答案

  • Hi netspidercn,

    Thanks for your post!

     

    StringBuilder 一般用于频繁操作字符串或者大字符串处理,您的问题:

    根据我的测试StringBuilder不论sb中是否存在"label",都会执行GetLabel()这个方法,这样无疑会造成资源的浪费

     

    这是100%的,在调用StringBuilder.Replace()方法时编译器必须先得到2个参数的值然后再开始执行方法,您应该先将GetLabel()的返回值付给一个String对象,然后再进行Replace操作,这样仅读取一次数据库。


    Please feel free to let me know if you have any further issues, thanks!



    Happy Coding:)
    Wayne Ye - Senior Software Development Engineer
    Personal Website:   http://WayneYe.com


    2010年11月12日 8:01

  • 非常感谢各位的回答,其实解决方法我自己当然可以搞定,但是试想一下以下情况,

    sb.Replace(“label1”,GetLabel(1));

    sb.Replace(“label2”,GetLabel(2));

    sb.Replace(“label3”,GetLabel(3));

    难道我每一次都要sb.ToString().IndexOf("label")

    然后再sb.Append(sb).Replace(“label3”,GetLabel(3));

    这样的话也太不优雅了,难道就不能内置自动判断吗,希望开发团队考虑。

    dear

    官方无法满足定每个人的需求,因每人条件都不同,
    你可自行定义扩充方法,替StringBuilder增加功能,将它变为自己的Framework

    請參考
    http://www.dotblogs.com.tw/yc421206/archive/2009/03/29/7755.aspx


    秘訣無它,唯勤而已
    2010年11月12日 11:06

全部回复

  • 这个系统不会自动帮你判断 你只能自己来实现 比如 stringBuilder.ToString().IndexOf("xxx")
    2010年11月12日 7:59
  • Hi netspidercn,

    Thanks for your post!

     

    StringBuilder 一般用于频繁操作字符串或者大字符串处理,您的问题:

    根据我的测试StringBuilder不论sb中是否存在"label",都会执行GetLabel()这个方法,这样无疑会造成资源的浪费

     

    这是100%的,在调用StringBuilder.Replace()方法时编译器必须先得到2个参数的值然后再开始执行方法,您应该先将GetLabel()的返回值付给一个String对象,然后再进行Replace操作,这样仅读取一次数据库。


    Please feel free to let me know if you have any further issues, thanks!



    Happy Coding:)
    Wayne Ye - Senior Software Development Engineer
    Personal Website:   http://WayneYe.com


    2010年11月12日 8:01
  • 非常感谢各位的回答,其实解决方法我自己当然可以搞定,但是试想一下以下情况,

    sb.Replace(“label1”,GetLabel(1));

    sb.Replace(“label2”,GetLabel(2));

    sb.Replace(“label3”,GetLabel(3));

    难道我每一次都要sb.ToString().IndexOf("label")

    然后再sb.Append(sb).Replace(“label3”,GetLabel(3));

    这样的话也太不优雅了,难道就不能内置自动判断吗,希望开发团队考虑。

    2010年11月12日 8:33

  • 非常感谢各位的回答,其实解决方法我自己当然可以搞定,但是试想一下以下情况,

    sb.Replace(“label1”,GetLabel(1));

    sb.Replace(“label2”,GetLabel(2));

    sb.Replace(“label3”,GetLabel(3));

    难道我每一次都要sb.ToString().IndexOf("label")

    然后再sb.Append(sb).Replace(“label3”,GetLabel(3));

    这样的话也太不优雅了,难道就不能内置自动判断吗,希望开发团队考虑。

    dear

    官方无法满足定每个人的需求,因每人条件都不同,
    你可自行定义扩充方法,替StringBuilder增加功能,将它变为自己的Framework

    請參考
    http://www.dotblogs.com.tw/yc421206/archive/2009/03/29/7755.aspx


    秘訣無它,唯勤而已
    2010年11月12日 11:06
  • 想想看如果是这样会怎么样呢,

    StringBuilder(string oldstr,string newstr,bool vil)

    {

    if(vil&&this.indexof(oldstr))

    {

    StringBuilder.replace(oldstr,newstr)

    }

    else

    {

    return this;

    }

    },

    StringBuilder(string oldstr,string newstr)

    {bool vil=false;}

     

    2010年11月15日 6:43