首页 > 代码库 > C#高性能截取字符串函数
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 else24 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 }
C#高性能截取字符串函数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。