zoukankan      html  css  js  c++  java
  • 高效地字符串替换

      这里指的不是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);
        }
  • 相关阅读:
    JS数据类型
    javaws运行jnlp文件被阻止(安全级别过高)
    linux sysctl的使用
    面向对象-特性property
    面向对象-封装
    面向对象-鸭子类型
    面向对象-多态与多态性
    面向对象-抽象类
    面向对象-组合
    面向对象-在子类使用父类的对象或属性
  • 原文地址:https://www.cnblogs.com/XmNotes/p/1883404.html
Copyright © 2011-2022 走看看