这里指的不是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);
}