/// <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); }