中英文字符串截取大比拼.docx
- 文档编号:6047703
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:18
- 大小:19.75KB
中英文字符串截取大比拼.docx
《中英文字符串截取大比拼.docx》由会员分享,可在线阅读,更多相关《中英文字符串截取大比拼.docx(18页珍藏版)》请在冰豆网上搜索。
中英文字符串截取大比拼
测试程序如下:
char[]sArr=newchar[10000];
for(inti=0;i<10000;i++)
{
if(i%2==0)
sArr[i]='A';
else
sArr[i]='B';
}
strings=newstring(sArr);
for(inti=0;i { if(i%10==0) s=s.Insert(i,"中国人"); } 这个长度测试起来,够可以了吧,呵呵! 先看一个比较慢的算法: publicstaticstringIntercept2(stringinput,intlength) { stringres=String.Empty; intbytecount=System.Text.Encoding.GetEncoding("GB2312").GetByteCount(input); if(length>=bytecount) { returninput; } for(inti=input.Length-1;i>=0;i--) { if(System.Text.Encoding.GetEncoding("GB2312").GetByteCount(input.Substring(0,i))<=length) { returninput.Substring(0,i); } } returnstring.Empty; } 这个算法的用时我没耐心等,估计用时要超过一分钟,有兴趣的朋友可以去等等看看。 再看下一个: publicstaticstringIntercept(stringinput,intp) { Encodingencode=Encoding.GetEncoding("gb2312"); byte[]byteArr=encode.GetBytes(input); if(byteArr.Length<=p)returninput; intm=0,n=0; foreach(bytebinbyteArr) { if(n>=p)break; if(b>127)m++;//重要一步: 对前p个字节中的值大于127的字符进行统计 n++; } if(m%2! =0)n=p+1;//如果非偶: 则说明末尾为双字节字符,截取位数加1 returnencode.GetString(byteArr,0,n); } 这个按奇偶位判断的算法耗时1784毫秒左右,我们再看一下: staticstringHalfSubstring(stringstr,intstrLength) { if(System.Text.Encoding.Unicode.GetByteCount(str) returnstr; byte[]bytesStr=System.Text.Encoding.Unicode.GetBytes(str); List intcount=0; for(inti=0;i { if(count==strLength) break; if(bytesStr[i+1]==0) { if(count+1==strLength) { list.Add(46); list.Add(0); count++; } else { list.Add(bytesStr[i]); list.Add(bytesStr[i+1]); count++; } } else { if(count+2>strLength) { list.Add(46); list.Add(0); count++; } elseif(count+2==strLength) { list.Add(46); list.Add(0); list.Add(46); list.Add(0); count+=2; } else { list.Add(bytesStr[i]); list.Add(bytesStr[i+1]); count+=2; } } } returnSystem.Text.Encoding.Unicode.GetString(list.ToArray()); } 这个算法用时540毫秒左右,比着上一个要快一倍多,不过还有更快的, 请看下一个: publicstaticstringIntercept1(stringinput,intlength) { if(input.Length==0) returnstring.Empty; if(input.Length<=length) returninput; inttotal=0; StringBuildertemp=newStringBuilder(); for(inti=0;i { if(total>=(length-1))break; strings=input.Substring(i,1); temp.Append(s); total+=Encoding.Default.GetByteCount(s); } temp.Append("..."); returntemp.ToString(); } 这个算法明显要比上一个要快很多,不过你认为它是我们今天字符串截取算法大比拼中的冠军了吗,请看下一个: publicstaticstringTruncate(stringoriginal,intlength) { intlen=original.Length; inti=0; for(;i { if((int)(original[i])>0xFF) --length; } if(length length=i; elseif(length>len) length=len; returnoriginal.Substring(0,length); } 这个算法用时22毫秒左右,算是一个很精炼的算法了。 这个算法已经可以说是我个这次大比拼中的冠军了,不过也凑巧,我们这次的目的是截取一个字符串的中文或者英文部分,又一个比较巧妙的算法出现了: 先定义一个枚举: /// ///截取字符枚举值,Varchar--英文一个字节,中文两个字节,NVarchar--无论中英文都是两个字节 /// publicenumCutType { Varchar, NVarchar } 再看算法: /// ///要截取的字节数 /// /// /// /// /// /// publicstaticstringCutString(stringvalue,intlength,boolellipsis,CutTypecuttype) { value=value.Trim(); if(value.Length==0) returnstring.Empty; if(cuttype==CutType.NVarchar) { if(value.Length>length/2) { value=value.Substring(0,length/2); if(ellipsis) returnvalue+".."; } } else { stringresultString=string.Empty; byte[]myByte=System.Text.Encoding.GetEncoding("gbk").GetBytes(value); if(myByte.Length>length) { resultString=Encoding.GetEncoding("gbk").GetString(myByte,0,length); stringlastChar=resultString.Substring(resultString.Length-1,1); if(lastChar.Equals(value.Substring(resultString.Length-1,1))) {value=resultString;}//如果截取后最后一个字符与原始输入字符串中同一位置的字符相等,则表示截取完成 else//如果不相等,则减去一个字节再截取 { value=Encoding.GetEncoding("gbk").GetString(myByte,0,length-1); } if(ellipsis) returnvalue+".."; returnvalue; } } returnvalue; } 说实话,这个算法真的是胜之不武,别人都是通过减少拆箱和装箱来提高性能的,而它干脆连循环也不要了,让前面诸位真的无语了。 最后再介绍一个截短字符串的方法: /// ///截短字串的函数 /// /// /// /// publicstaticstringLeft(stringmText,intbyteCount) { if(byteCount<1) returnmText; if(System.Text.Encoding.Default.GetByteCount(mText)<=byteCount) { returnmText; } else { byte[]txtBytes=System.Text.Encoding.Default.GetBytes(mText); byte[]newBytes=newbyte[byteCount-4]; for(inti=0;i { newBytes[i]=txtBytes[i]; } stringOutPut=System.Text.Encoding.Default.GetString(newBytes)+"..."; if(OutPut.EndsWith("? ...")==true) { OutPut=OutPut.Substring(0,OutPut.Length-4); OutPut+="..."; } returnOutPut; } } 本程序测试结果是通过本人的机器测试,因机器不同,测试时间不同,测试结果难免也有差异,不过同一个算法的差别不是很大。 下面我给出测试的源程序: classProgram { //本示例测试方法相同 staticvoidMain(string[]args) { char[]sArr=newchar[10000]; for(inti=0;i<10000;i++) { if(i%2==0) sArr[i]='A'; else sArr[i]='B'; } strings=newstring(sArr); for(inti=0;i { if(i%10==0) s=s.Insert(i,"中国人"); } System.Diagnostics.Stopwatchsw=newSystem.Diagnostics.Stopwatch(); sw.Start(); for(inti=0;i<10000;i++)//这个算法用时: 22毫秒左右 Truncate(s,255); sw.Stop(); Console.WriteLine("字符串截取的方法Truncate: "+sw.Elapsed.TotalMilliseconds+"ms"); sw.Reset(); sw.Start(); for(inti=0;i<10000;i++)//这个用时271毫秒左右 Intercept1(s,255); sw.Stop(); Console.WriteLine("字符串截取的方法Intercept1: "+sw.Elapsed.TotalMilliseconds+"ms"); sw.Reset(); sw.Start(); for(inti=0;i<10000;i++)//这个用时540毫秒左右 HalfSubstring(s,255); sw.Stop(); Console.WriteLine("字符串截取的方法HalfSubstring: "+sw.Elapsed.TotalMilliseconds+"ms"); sw.Reset(); sw.Start(); for(inti=0;i<10000;i++)//这个用时1784毫秒左右 Intercept(s,255); sw.Stop(); Console.WriteLine("按奇偶位判断的方法Intercept: "+sw.Elapsed.TotalMilliseconds+"ms"); //sw.Reset(); //sw.Start(); //for(inti=0;i<10000;i++)//这个慢的吓人,我没耐心等... //Intercept2(s,255); //sw.Stop(); //Console.WriteLine("网友提供的方法: "+sw.Elapsed.TotalMilliseconds+"ms"); Console.Read(); } //这个算法用时: 22毫秒左右 publicstaticstringTruncate(stringoriginal,intlength) { intlen=original.Length; inti=0; for(;i { if((int)(original[i])>0xFF) --length; } if(length length=i; elseif(length>len) length=len; returnoriginal.Substring(0,length); } //这个用时1784毫秒左右 publicstaticstringIntercept(stringinput,intp) { Encodingencode=Encoding.GetEncoding("gb2312"); byte[]byteArr=encode.GetBytes(input); if(byteArr.Length<=p)returninput; intm=0,n=0; foreach(bytebinbyteArr) { if(n>=p)break; if(b>127)m++;//重要一步: 对前p个字节中的值大于127的字符进行统计 n++; } if(m%2! =0)n=p+1;//如果非偶: 则说明末尾为双字节字符,截取位数加1 returnencode.GetString(byteArr,0,n); } //这个用时271毫秒左右 publicstaticstringIntercept1(stringinput,intlength) { if(input.Length==0) returnstring.Empty; if(input.Length<=length) returninput; inttotal=0; StringBuildertemp=newStringBuilder(); for(inti=0;i { if(total>=(length-1))break; strings=input.Substring(i,1); temp.Append(s); total+=Encoding.Default.GetByteCount(s); } temp.Append("..."); returntemp.ToString(); } //这个慢的吓人,我没耐心等... publicstaticstringIntercept2(stringinput,intlength) { stringres=String.Empty; intbytecount=System.Text.Encoding.GetEncoding("GB2312").GetByteCount(input); if(length>=bytecount) { returninput; } for(inti=input.Length-1;i>=0;i--) { if(System.Text.Encoding.GetEncoding("GB2312").GetByteCount(input.Substring(0,i))<=length) { returninput.Substring(0,i); } } returnstring.Empty; } //这个用时540毫秒左右 staticstringHalfSubstring(stringstr,intstrLength) { if(System.Text.Encoding.Unicode.GetByteCount(str) returnstr; byte[]bytesStr=System.Text.Encoding.Unicode.GetBytes(str); List intcount=0; for(inti=0;i { if(count==strLength) break; if(bytesStr[i+1]==0) { if(count+1==strLength) { list.Add(46); list.Add(0); count++; } else { list.Add(bytesStr[i]); list.Add(bytesStr[i+1]); count++; } } else { if(count+2>strLength) { list.Add(46); list.Add(0); count++; } elseif(count+2==strLength) { list.Add(46); list.Add(0); list.Add(46); list.Add(0); count+=2; } else { list.Add(bytesStr[i]); list.Add(bytesStr[i+1]); count+=2; } } } returnSystem.Text.Encoding.Unicode.GetString(list.ToArray()); } /// ///要截取的字节数 /// /// /// /// /// /// publicstaticstringCutString(stringvalue,intlength,boolellipsis,CutTypecuttype) { value=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中英文 字符串 截取 比拼
![提示](https://static.bdocx.com/images/bang_tan.gif)