zoukankan      html  css  js  c++  java
  • 在C#中截取指定长度的中文字符串(效率提高2500倍)

    C#中字符串截断本没有那么麻烦,问题就出在string.Substring()这个方法将中文也按一个字符计算,导致我们在实际应用中截取字符串(中英文组合)后的“长度”不一致。

    国际惯例,在网上搜索了一下,大致得到了两中截断算法:
    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次!
    (注:实际运行时间和原始字符串长度、截取长度、电脑性能有关。但同条件下的效率比值是基本稳定的。)

  • 相关阅读:
    xshell安装错解决方案
    (转)进程process和线程thread的关系
    selenium Gird
    python发布文件(windows)
    (转)ci
    selenium通过python字典获取配置
    selenium断言的分类
    C#从Image上读取文本
    C#屏幕截图
    WPF实现TextBox水印效果
  • 原文地址:https://www.cnblogs.com/uonun/p/1698964.html
Copyright © 2011-2022 走看看