Exemple #1
0
        /// <summary>
        /// 将字符串中的指定字符替换成转义字符串,算法效率相对高效
        /// </summary>
        /// <param name="source">需要转义的字符串</param>
        /// <param name="replaceString">需要替换字符串数组</param>
        /// <param name="escapeFunc">判断是否需要转义字符,返回-1无需转义,
        /// 返回其他数字将去数组replaceString查找需要替换的字符串</param>
        /// <returns></returns>
        public static string EscapeString(string source, string[] replaceString, Func <char, int> escapeFunc)
        {
            if (string.IsNullOrEmpty(source))
            {
                return(string.Empty);
            }
            TkDebug.AssertArgumentNull(escapeFunc, "escapeFunc", null);
            TkDebug.AssertEnumerableArgumentNull <string>(replaceString, "replaceString", null);

            StringBuilder cachedStringBuilder = null;
            int           start = 0;
            int           pos   = 0;
            int           count = source.Length;

            for (int i = 0; i < count; ++i)
            {
                pos = escapeFunc(source[i]);
                if (pos < 0)
                {
                    continue;
                }
                if (cachedStringBuilder == null)
                {
                    cachedStringBuilder = new StringBuilder();
                }
                cachedStringBuilder.Append(source.Substring(start, i - start));
                TkDebug.Assert(pos < replaceString.Length, string.Format(ObjectUtil.SysCulture,
                                                                         "参数escapeFunc返回的值有误,replaceString的长度为{0},但是返回值却是{1},越界了",
                                                                         replaceString.Length, pos), null);
                cachedStringBuilder.Append(replaceString[pos]);
                start = i + 1;
            }
            if (start == 0)
            {
                return(source);
            }
            else if (start < count)
            {
                cachedStringBuilder.Append(source.Substring(start, count - start));
            }
            string s = cachedStringBuilder.ToString();

            return(s);
        }