高效地字符串替换
這里指的不是String類里的Replace方法。如果不知道被替換字符串的內(nèi)容,而只知道其位置和長度的話,就可以用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();}記住要用倒序循環(huán)。另外也可以使用List<char>來完成,有InsertRange和RemoveRange方法,同樣方便,可惜最后轉(zhuǎn)換成String時要多復(fù)制一次:return new String(charList),效率大打折扣(可能差幾十倍)。
在程序中,I/O操作開銷最大,其次是申請內(nèi)存,盡量少創(chuàng)建對象,合理利用現(xiàn)有對象是程序高效的最重要秘笈之一??碨tringBuilder源代碼,關(guān)鍵的Append和ToString操作都是C++寫的,用指針操作內(nèi)部的String,不用創(chuàng)建新的,所以效率高。
剛剛才發(fā)現(xiàn),原來.Net 3.5以下的StringBuilder沒有Clear方法,用設(shè)屬性Length = 0代替。這種方式其實(shí)不錯,有韻味,提示列表里方法已經(jīng)很多了。有一個方法倒是可以有,以前在拼接字符串,比如一段Json時,還很傻的用Remove方法刪掉最后的逗號,其實(shí)使用ToString方法的另一個重載就可以,然而需要兩個參數(shù),如果只需一個參數(shù)就更舒服了,就像這樣:
public static string ToString(this StringBuilder builder, int length){return builder.ToString(0, builder.Length - length);}總結(jié)
- 上一篇: 配置本地DNS服务器地址「建议收藏」
- 下一篇: sql 查询性能的问题 有order b