ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:19.75KB ,
资源ID:6047703      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6047703.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(中英文字符串截取大比拼.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

中英文字符串截取大比拼.docx

1、中英文字符串截取大比拼测试程序如下:char sArr = new char10000; for (int i = 0; i 10000; i+) if (i % 2 = 0) sArri = A; else sArri = B; string s = new string(sArr); for (int i = 0; i = bytecount) return input; for (int i = input.Length - 1; i = 0; i-) if (System.Text.Encoding.GetEncoding(GB2312).GetByteCount(input.Subs

2、tring(0, i) = length) return input.Substring(0, i); return string.Empty; 这个算法的用时我没耐心等,估计用时要超过一分钟,有兴趣的朋友可以去等等看看。再看下一个: public static string Intercept(string input, int p) Encoding encode = Encoding.GetEncoding(gb2312); byte byteArr = encode.GetBytes(input); if (byteArr.Length = p) break; if (b 127) m

3、+; /重要一步:对前p个字节中的值大于127的字符进行统计 n+; if (m % 2 != 0) n = p + 1; /如果非偶:则说明末尾为双字节字符,截取位数加1 return encode.GetString(byteArr, 0, n); 这个按奇偶位判断的算法耗时1784毫秒左右,我们再看一下:static string HalfSubstring(string str, int strLength) if (System.Text.Encoding.Unicode.GetByteCount(str) strLength) return str; byte bytesStr =

4、 System.Text.Encoding.Unicode.GetBytes(str); List list = new List(); int count = 0; for (int i = 0; i strLength) list.Add(46); list.Add(0); count+; else if (count + 2 = strLength) list.Add(46); list.Add(0); list.Add(46); list.Add(0); count += 2; else list.Add(bytesStri); list.Add(bytesStri + 1); cou

5、nt += 2; return System.Text.Encoding.Unicode.GetString(list.ToArray(); 这个算法用时540毫秒左右,比着上一个要快一倍多,不过还有更快的,请看下一个: public static string Intercept1(string input, int length) if (input.Length=0) return string.Empty; if (input.Length = length) return input; int total = 0; StringBuilder temp = new StringBui

6、lder(); for (int i = 0; i = (length - 1) break; string s = input.Substring(i, 1); temp.Append(s); total += Encoding.Default.GetByteCount(s); temp.Append(.); return temp.ToString(); 这个算法明显要比上一个要快很多,不过你认为它是我们今天字符串截取算法大比拼中的冠军了吗,请看下一个: public static string Truncate(string original, int length) int len =

7、 original.Length; int i = 0; for (; i length & i 0xFF) -length; if (length len) length = len; return original.Substring(0, length); 这个算法用时22毫秒左右,算是一个很精炼的算法了。这个算法已经可以说是我个这次大比拼中的冠军了,不过也凑巧,我们这次的目的是截取一个字符串的中文或者英文部分,又一个比较巧妙的算法出现了: 先定义一个枚举:/ / 截取字符枚举值,Varchar-英文一个字节,中文两个字节,NVarchar-无论中英文都是两个字节 / public en

8、um CutType Varchar, NVarchar再看算法:/ / 要截取的字节数 / / 输入的字符串 / 限定长度 / 是否需要省略号,true-需要,false-不需要 / 截取类型 / 截取后的字符串,如果是NVarchar-则20个字节就会有10个字符,Varchar-20个字节会有=10个字符 public static string CutString(string value, int length, bool ellipsis, CutType cuttype) value = value.Trim(); if (value.Length = 0) return str

9、ing.Empty; if (cuttype = CutType.NVarchar) if (value.Length length / 2) value = value.Substring(0, length / 2); if (ellipsis) return value + .; else string resultString = string.Empty; byte myByte = System.Text.Encoding.GetEncoding(gbk).GetBytes(value); if (myByte.Length length) resultString = Encod

10、ing.GetEncoding(gbk).GetString(myByte, 0, length); string lastChar = resultString.Substring(resultString.Length - 1, 1); if (lastChar.Equals(value.Substring(resultString.Length - 1, 1) value = resultString; /如果截取后最后一个字符与原始输入字符串中同一位置的字符相等,则表示截取完成 else/如果不相等,则减去一个字节再截取 value = Encoding.GetEncoding(gbk

11、).GetString(myByte, 0, length - 1); if (ellipsis) return value + .; return value; return value; 说实话,这个算法真的是胜之不武,别人都是通过减少拆箱和装箱来提高性能的,而它干脆连循环也不要了,让前面诸位真的无语了。最后再介绍一个截短字符串的方法: / / 截短字串的函数 / / 要加工的字串 / 长度 / 被加工过的字串 public static string Left(string mText, int byteCount) if (byteCount 1) return mText; if (

12、System.Text.Encoding.Default.GetByteCount(mText) = byteCount) return mText; else byte txtBytes = System.Text.Encoding.Default.GetBytes(mText); byte newBytes = new bytebyteCount - 4; for (int i = 0; i byteCount - 4; i+) newBytesi = txtBytesi; string OutPut = System.Text.Encoding.Default.GetString(new

13、Bytes) + .; if (OutPut.EndsWith(?.) = true) OutPut = OutPut.Substring(0, OutPut.Length - 4); OutPut += .; return OutPut; 本程序测试结果是通过本人的机器测试,因机器不同,测试时间不同,测试结果难免也有差异,不过同一个算法的差别不是很大。下面我给出测试的源程序:class Program /本示例测试方法相同 static void Main(string args) char sArr = new char10000; for (int i = 0; i 10000; i+)

14、 if (i % 2 = 0) sArri = A; else sArri = B; string s = new string(sArr); for (int i = 0; i sArr.Length; i+) if (i % 10 = 0) s = s.Insert(i, 中国人); System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); sw.Start(); for (int i = 0; i 10000; i+)/这个算法用时:22毫秒左右 Truncate(s, 255); sw.Stop(); C

15、onsole.WriteLine(字符串截取的方法Truncate: + sw.Elapsed.TotalMilliseconds + ms); sw.Reset(); sw.Start(); for (int i = 0; i 10000; i+) /这个用时271毫秒左右 Intercept1(s, 255); sw.Stop(); Console.WriteLine(字符串截取的方法Intercept1: + sw.Elapsed.TotalMilliseconds + ms); sw.Reset(); sw.Start(); for (int i = 0; i 10000; i+) /

16、这个用时540毫秒左右 HalfSubstring(s, 255); sw.Stop(); Console.WriteLine(字符串截取的方法HalfSubstring: + sw.Elapsed.TotalMilliseconds + ms); sw.Reset(); sw.Start(); for (int i = 0; i 10000; i+) /这个用时1784毫秒左右 Intercept(s, 255); sw.Stop(); Console.WriteLine(按奇偶位判断的方法Intercept: + sw.Elapsed.TotalMilliseconds + ms); /s

17、w.Reset(); /sw.Start(); /for (int i = 0; i 10000; i+)/这个慢的吓人,我没耐心等. / Intercept2(s, 255); /sw.Stop(); /Console.WriteLine(网友提供的方法: + sw.Elapsed.TotalMilliseconds + ms); Console.Read(); /这个算法用时:22毫秒左右 public static string Truncate(string original, int length) int len = original.Length; int i = 0; for

18、(; i length & i 0xFF) -length; if (length len) length = len; return original.Substring(0, length); /这个用时1784毫秒左右 public static string Intercept(string input, int p) Encoding encode = Encoding.GetEncoding(gb2312); byte byteArr = encode.GetBytes(input); if (byteArr.Length = p) break; if (b 127) m+; /重

19、要一步:对前p个字节中的值大于127的字符进行统计 n+; if (m % 2 != 0) n = p + 1; /如果非偶:则说明末尾为双字节字符,截取位数加1 return encode.GetString(byteArr, 0, n); /这个用时271毫秒左右 public static string Intercept1(string input, int length) if (input.Length=0) return string.Empty; if (input.Length = length) return input; int total = 0; StringBuil

20、der temp = new StringBuilder(); for (int i = 0; i = (length - 1) break; string s = input.Substring(i, 1); temp.Append(s); total += Encoding.Default.GetByteCount(s); temp.Append(.); return temp.ToString(); /这个慢的吓人,我没耐心等. public static string Intercept2(string input, int length) string res = String.Em

21、pty; int bytecount = System.Text.Encoding.GetEncoding(GB2312).GetByteCount(input); if (length = bytecount) return input; for (int i = input.Length - 1; i = 0; i-) if (System.Text.Encoding.GetEncoding(GB2312).GetByteCount(input.Substring(0, i) = length) return input.Substring(0, i); return string.Emp

22、ty; /这个用时540毫秒左右 static string HalfSubstring(string str, int strLength) if (System.Text.Encoding.Unicode.GetByteCount(str) strLength) return str; byte bytesStr = System.Text.Encoding.Unicode.GetBytes(str); List list = new List(); int count = 0; for (int i = 0; i strLength) list.Add(46); list.Add(0);

23、 count+; else if (count + 2 = strLength) list.Add(46); list.Add(0); list.Add(46); list.Add(0); count += 2; else list.Add(bytesStri); list.Add(bytesStri + 1); count += 2; return System.Text.Encoding.Unicode.GetString(list.ToArray(); / / 要截取的字节数 / / 输入的字符串 / 限定长度 / 是否需要省略号,true-需要,false-不需要 / 截取类型 / 截取后的字符串,如果是NVarchar-则20个字节就会有10个字符,Varchar-20个字节会有=10个字符 public static string CutString(string value, int length, bool ellipsis, CutType cuttype) value =

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1