在C#中截取指定长度的中文字符串(效率提高2500倍)
2010-03-28 18:17
337 查看
C#中字符串截断本没有那么麻烦,问题就出在string.Substring()这个方法将中文也按一个字符计算,导致我们在实际应用中截取字符串(中英文组合)后的“长度”不一致。
国际惯例,在网上搜索了一下,大致得到了两中截断算法:
1. 从起始位置取得字符 -> 逐一用正则表达式匹配 -> 拼接成最终字符串。(这是广为流传的方法,也是效率最低的方法。)
2. 从起始位置取得字符 -> 逐一用ASCII比较 -> 再拼接成最终字符串。
相比之下,算法2比算法1高明,毕竟ASCII比较比正则表达式的执行效率更高。但最终,我仍然没有使用算法2,而是进行了进一步的优化:
最后,通过比较,广为流传的算法1执行100次就需要700多毫秒,而我的算法700毫秒可执行250000次!
(注:实际运行时间和原始字符串长度、截取长度、电脑性能有关。但同条件下的效率比值是基本稳定的。)
国际惯例,在网上搜索了一下,大致得到了两中截断算法:
1. 从起始位置取得字符 -> 逐一用正则表达式匹配 -> 拼接成最终字符串。(这是广为流传的方法,也是效率最低的方法。)
2. 从起始位置取得字符 -> 逐一用ASCII比较 -> 再拼接成最终字符串。
相比之下,算法2比算法1高明,毕竟ASCII比较比正则表达式的执行效率更高。但最终,我仍然没有使用算法2,而是进行了进一步的优化:
public static string CutStr(string str, int len) { if (str == null || str.Length == 0 || len <= 0) { return string.Empty; } int l = str.Length; #region 计算长度 int clen = 0; while (clen < len && clen < l) { //每遇到一个中文,则将目标长度减一。 if ((int)str[clen] > 128) { len--; } clen++; } #endregion if (clen < l) { return str.Substring(0, clen) + "..."; } else { return str; } }
最后,通过比较,广为流传的算法1执行100次就需要700多毫秒,而我的算法700毫秒可执行250000次!
(注:实际运行时间和原始字符串长度、截取长度、电脑性能有关。但同条件下的效率比值是基本稳定的。)
相关文章推荐
- 在C#中截取指定长度的中文字符串(效率提高2500倍)
- 在C#中截取指定长度的中文字符串
- 在C#中截取指定长度的中文字符串
- 在C#中截取指定长度的中文字符串.
- 在C#中截取指定长度的中文字符串
- 【转载】C# 字符串截取指定长度的中文字符--精点
- C#截取指定长度中英文字符串方法
- 用C#截取指定长度的中英文混合字符串 改进版
- [转]C# 截取指定长度的中英文混合字符串的算法
- [1]字符串按中文符占3位进行指定长度剪切[2]Double类型截取指定长度(指定长度=整数位+小数位)
- C#截取指定长度中英文字符串方法
- 用C#截取指定长度的中英文混合字符串
- 用C#截取指定长度的中英文混合字符串 改进版--转载
- 用C#截取指定长度的中英文混合字符串(转)
- SQL 字符串截取左边指定长度字符串中文、英文
- C#截取指定长度中英文字符串方法
- 用C#截取指定长度的中英文混合字符串
- C# 汉字的字符串截取指定字节的长度
- c#的中英文混合字符串截取指定长度,startidx从0开始
- 高效率的C#截取指定长度字符串,大于指定长度的,在末尾显示指定字符,默认为"..."