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