zoukankan      html  css  js  c++  java
  • C#高性能截取字符串函数

    去年的时候不记得是要做什么了,写了个用C#截取指定长度的方法,当时颇费了一番周折,因为想错了方向。

    例如要截取字符串"我是1个中国人",取3位长度,那得到的结果是"我",如果取6位长度,得到的结果是"我是1",因为汉字是两个字节。

    于是又重写了一发……

     1 public static string GetSubString(string str, int length)
     2 
     3     {
     4 
     5 string temp = str;
     6 
     7 int j = 0;
     8 
     9 int k = 0;
    10 
    11         for (int i = 0; i <temp.Length; i++)
    12 
    13         {
    14 
    15             if (Regex.IsMatch(temp.Substring(i, 1), @"[u4e00-u9fa5]+"))
    16 
    17            {
    18 
    19                 j += 2;
    20 
    21             }
    22 
    23             else
    24 
    25             {
    26 
    27                 j += 1;
    28 
    29             }
    30 
    31             if (j <= length)
    32 
    33             {
    34 
    35                 k += 1;
    36 
    37             }
    38 
    39             if (j >= length)
    40 
    41             {
    42 
    43                 return temp.Substring(0, k);
    44 
    45             }
    46 
    47         }
    48 
    49         return temp;
    50 
    51     }
    52 
    53  

    具体思路是,定义两个变量:j 与K,例如要截取字符串"我是1个中国人",取3位长度,从第一个字符开始判断——temp.Substring(i, 1),如果是双字节j+2,否则加1,而变量K则每次循环加1,用来执行最后的截取操作。

    当j <= 要截取的字节数,变量K停止加1。

    当j >= 要截取的字节数,根据K返回截取后的结果。

    看到别人的方法,都是最先将整个字符串中的中文替换成双字节,然后判断总长度是否大于需要截取的长度,如果大于再执行截取,而这样无疑是低效的(如果需要截取的字符串有1万个字符,需要返回的是20个字符,同时返回20条记录的话需要替换几十万次....),还要接下来再判断是该截取几位.....

     1 public static string GetSubString(string str, int length) {
     2 
     3 string temp = str;
     4 
     5 int j = 0, k=0;
     6 
     7  
     8 
     9 CharEnumeratorce = str.GetEnumerator();
    10 
    11 while (ce.MoveNext()) {
    12 
    13 j += (ce.Current> 0 &&ce.Current< 255) ? 1 : 2 ;
    14 
    15  
    16 
    17 if (j <= length) {
    18 
    19 k++;
    20 
    21 } else {
    22 
    23 temp = str.Substring(0, k);
    24 
    25 break;
    26 
    27 }
    28 
    29 }
    30 
    31  
    32 
    33 return temp;
    34 
    35 }

    这个其实有问题,只能判断中文,应该判断所有双字节字符

     1 public static string GetStrLenAll(string s, intlen, string style)
     2 
     3 {
     4 
     5 string temp = s;
     6 
     7 if (Regex.Replace(temp, "[^x00-xff]", "zz", RegexOptions.IgnoreCase).Length <= len)
     8 
     9 {
    10 
    11 return temp;
    12 
    13 }
    14 
    15 for (int i = temp.Length; i >= 0; i--)
    16 
    17 {
    18 
    19 temp = temp.Substring(0, i);
    20 
    21 if (Regex.Replace(temp, "[^x00-xff]", "zz", RegexOptions.IgnoreCase).Length <= len - style.Length)
    22 
    23 {
    24 
    25 return temp + style;
    26 
    27 }
    28 
    29 }
    30 
    31 return "";
    32 
    33 }
  • 相关阅读:
    A1066 Root of AVL Tree (25 分)
    A1099 Build A Binary Search Tree (30 分)
    A1043 Is It a Binary Search Tree (25 分) ——PA, 24/25, 先记录思路
    A1079; A1090; A1004:一般树遍历
    A1053 Path of Equal Weight (30 分)
    A1086 Tree Traversals Again (25 分)
    A1020 Tree Traversals (25 分)
    A1091 Acute Stroke (30 分)
    A1103 Integer Factorization (30 分)
    A1032 Sharing (25 分)
  • 原文地址:https://www.cnblogs.com/zzy9669/p/4051258.html
Copyright © 2011-2022 走看看