这里指的不是String类里的Replace方法。如果不知道被替换字符串的内容,而只知道其位置和长度的话,就可以用StringBuilder轻松高效完成替换。

    public struct ReplaceText
    {
        /// 
        /// Start position
        /// 
        public int Start { get; set;} 
        /// 
        /// The length of text to be replaced
        /// 
        public int Length { get; set; } 
        /// 
        /// Text to replace
        /// 
        public string Text { get; set; } 
    }

    static string Replace(string content, List replacements)
    {
        var sb = new StringBuilder(content);

        for (int i = replacements.Count - 1; i >= 0; i--)   
        {
            var section = replacements[i];
            sb.Remove(section.Start, section.Length);
            sb.Insert(section.Start, section.Text);
        }

        return sb.ToString();
    }

  记住要用倒序循环。另外也可以使用List<char>来完成,有InsertRange和RemoveRange方法,同样方便,可惜最后转换成String时要多复制一次:return new String(charList),效率大打折扣(可能差几十倍)。

  在程序中,I/O操作开销最大,其次是申请内存,尽量少创建对象,合理利用现有对象是程序高效的最重要秘笈之一。看StringBuilder源代码,关键的Append和ToString操作都是C++写的,用指针操作内部的String,不用创建新的,所以效率高。

  刚刚才发现,原来.Net 3.5以下的StringBuilder没有Clear方法,用设属性Length = 0代替。这种方式其实不错,有韵味,提示列表里方法已经很多了。有一个方法倒是可以有,以前在拼接字符串,比如一段Json时,还很傻的用Remove方法删掉最后的逗号,其实使用ToString方法的另一个重载就可以,然而需要两个参数,如果只需一个参数就更舒服了,就像这样:

    public static string ToString(this StringBuilder builder, int length)
    {
        return builder.ToString(0, builder.Length - length);
    }
posted on 2010-11-21 19:37  小城故事  阅读(949)  评论(1编辑  收藏  举报