C#高性能截取字符串函数
2020-12-13 13:58
标签:style blog color io ar for sp div on 去年的时候不记得是要做什么了,写了个用C#截取指定长度的方法,当时颇费了一番周折,因为想错了方向。 例如要截取字符串"我是1个中国人",取3位长度,那得到的结果是"我",如果取6位长度,得到的结果是"我是1",因为汉字是两个字节。 于是又重写了一发…… 具体思路是,定义两个变量:j 与K,例如要截取字符串"我是1个中国人",取3位长度,从第一个字符开始判断——temp.Substring(i, 1),如果是双字节j+2,否则加1,而变量K则每次循环加1,用来执行最后的截取操作。 当j
当j >= 要截取的字节数,根据K返回截取后的结果。 看到别人的方法,都是最先将整个字符串中的中文替换成双字节,然后判断总长度是否大于需要截取的长度,如果大于再执行截取,而这样无疑是低效的(如果需要截取的字符串有1万个字符,需要返回的是20个字符,同时返回20条记录的话需要替换几十万次....),还要接下来再判断是该截取几位..... 这个其实有问题,只能判断中文,应该判断所有双字节字符 C#高性能截取字符串函数 标签:style blog color io ar for sp div on 原文地址:http://www.cnblogs.com/zzy9669/p/4051258.html 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
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.Current255) ? 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 style.Length)
22
23 {
24
25 return temp + style;
26
27 }
28
29 }
30
31 return "";
32
33 }