高效地字符串替换
這里指的不是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);}總結
- 上一篇: 配置本地DNS服务器地址「建议收藏」
- 下一篇: 模糊神经网络FNN「建议收藏」(模糊数学