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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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方法的另一个重载就可以,然而需要两个参数,如果只需一个参数就更舒服了,就像这样:

1
2
3
4
public static string ToString(this StringBuilder builder, int length)
{
    return builder.ToString(0, builder.Length - length);
}
posted on   小城故事  阅读(949)  评论(1编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示