中英文字符串截取大比拼.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);Listlist=newList();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(lengthlength=i;elseif(length>len)length=len;returnoriginal.Substring(0,length);}这个算法用时22毫秒左右,算是一个很精炼的算法了。这个算法已经可以说是我个这次大比拼中的冠军了,不过也凑巧,我们这次的目的是截取一个字符串的中文或者英文部分,又一个比较巧妙的算法出现了:先定义一个枚举://////截取字符枚举值,Varchar--英文一个字节,中文两个字节,NVarchar--无论中英文都是两个字节///publicenumCutType{Varchar,NVarchar}再看算法://////要截取的字节数//////输入的字符串///限定长度///是否需要省略号,true--需要,false--不需要///截取类型///截取后的字符串,如果是NVarchar--则20个字节就会有10个字符,Varchar--20个字节会有>=10个字符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';elsesArr[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(lengthlength=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);Listlist=newList();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());} //////要截取的字节数//////输入的字符串///限定长度///是否需要省略号,true--需要,false--不需要///截取类型///截取后的字符串,如果是NVarchar--则20个字节就会有10个字符,Varchar--20个字节会有>=10个字符publicstaticstringCutString(stringvalue,intlength,boolellipsis,CutTypecuttype){value=
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);Listlist=newList();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(lengthlength=i;elseif(length>len)length=len;returnoriginal.Substring(0,length);}这个算法用时22毫秒左右,算是一个很精炼的算法了。这个算法已经可以说是我个这次大比拼中的冠军了,不过也凑巧,我们这次的目的是截取一个字符串的中文或者英文部分,又一个比较巧妙的算法出现了:先定义一个枚举://////截取字符枚举值,Varchar--英文一个字节,中文两个字节,NVarchar--无论中英文都是两个字节///publicenumCutType{Varchar,NVarchar}再看算法://////要截取的字节数//////输入的字符串///限定长度///是否需要省略号,true--需要,false--不需要///截取类型///截取后的字符串,如果是NVarchar--则20个字节就会有10个字符,Varchar--20个字节会有>=10个字符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';elsesArr[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(lengthlength=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);Listlist=newList();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());} //////要截取的字节数//////输入的字符串///限定长度///是否需要省略号,true--需要,false--不需要///截取类型///截取后的字符串,如果是NVarchar--则20个字节就会有10个字符,Varchar--20个字节会有>=10个字符publicstaticstringCutString(stringvalue,intlength,boolellipsis,CutTypecuttype){value=
returnstr;
byte[]bytesStr=System.Text.Encoding.Unicode.GetBytes(str);
Listlist=newList();
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(lengthlength=i;elseif(length>len)length=len;returnoriginal.Substring(0,length);}这个算法用时22毫秒左右,算是一个很精炼的算法了。这个算法已经可以说是我个这次大比拼中的冠军了,不过也凑巧,我们这次的目的是截取一个字符串的中文或者英文部分,又一个比较巧妙的算法出现了:先定义一个枚举://////截取字符枚举值,Varchar--英文一个字节,中文两个字节,NVarchar--无论中英文都是两个字节///publicenumCutType{Varchar,NVarchar}再看算法://////要截取的字节数//////输入的字符串///限定长度///是否需要省略号,true--需要,false--不需要///截取类型///截取后的字符串,如果是NVarchar--则20个字节就会有10个字符,Varchar--20个字节会有>=10个字符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';elsesArr[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(lengthlength=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);Listlist=newList();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());} //////要截取的字节数//////输入的字符串///限定长度///是否需要省略号,true--需要,false--不需要///截取类型///截取后的字符串,如果是NVarchar--则20个字节就会有10个字符,Varchar--20个字节会有>=10个字符publicstaticstringCutString(stringvalue,intlength,boolellipsis,CutTypecuttype){value=
if(count==strLength)
break;
if(bytesStr[i+1]==0)
if(count+1==strLength)
list.Add(46);
list.Add(0);
count++;
list.Add(bytesStr[i]);
list.Add(bytesStr[i+1]);
if(count+2>strLength)
elseif(count+2==strLength)
count+=2;
returnSystem.Text.Encoding.Unicode.GetString(list.ToArray());
这个算法用时540毫秒左右,比着上一个要快一倍多,不过还有更快的,
请看下一个:
publicstaticstringIntercept1(stringinput,intlength)
if(input.Length==0)
if(input.Length<=length)
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(lengthlength=i;elseif(length>len)length=len;returnoriginal.Substring(0,length);}这个算法用时22毫秒左右,算是一个很精炼的算法了。这个算法已经可以说是我个这次大比拼中的冠军了,不过也凑巧,我们这次的目的是截取一个字符串的中文或者英文部分,又一个比较巧妙的算法出现了:先定义一个枚举://////截取字符枚举值,Varchar--英文一个字节,中文两个字节,NVarchar--无论中英文都是两个字节///publicenumCutType{Varchar,NVarchar}再看算法://////要截取的字节数//////输入的字符串///限定长度///是否需要省略号,true--需要,false--不需要///截取类型///截取后的字符串,如果是NVarchar--则20个字节就会有10个字符,Varchar--20个字节会有>=10个字符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';elsesArr[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(lengthlength=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);Listlist=newList();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());} //////要截取的字节数//////输入的字符串///限定长度///是否需要省略号,true--需要,false--不需要///截取类型///截取后的字符串,如果是NVarchar--则20个字节就会有10个字符,Varchar--20个字节会有>=10个字符publicstaticstringCutString(stringvalue,intlength,boolellipsis,CutTypecuttype){value=
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(lengthlength=i;elseif(length>len)length=len;returnoriginal.Substring(0,length);}这个算法用时22毫秒左右,算是一个很精炼的算法了。这个算法已经可以说是我个这次大比拼中的冠军了,不过也凑巧,我们这次的目的是截取一个字符串的中文或者英文部分,又一个比较巧妙的算法出现了:先定义一个枚举://////截取字符枚举值,Varchar--英文一个字节,中文两个字节,NVarchar--无论中英文都是两个字节///publicenumCutType{Varchar,NVarchar}再看算法://////要截取的字节数//////输入的字符串///限定长度///是否需要省略号,true--需要,false--不需要///截取类型///截取后的字符串,如果是NVarchar--则20个字节就会有10个字符,Varchar--20个字节会有>=10个字符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';elsesArr[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(lengthlength=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);Listlist=newList();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());} //////要截取的字节数//////输入的字符串///限定长度///是否需要省略号,true--需要,false--不需要///截取类型///截取后的字符串,如果是NVarchar--则20个字节就会有10个字符,Varchar--20个字节会有>=10个字符publicstaticstringCutString(stringvalue,intlength,boolellipsis,CutTypecuttype){value=
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
再看算法:
///要截取的字节数
///输入的字符串
///限定长度
///是否需要省略号,true--需要,false--不需要
///截取类型
///截取后的字符串,如果是NVarchar--则20个字节就会有10个字符,Varchar--20个字节会有>=10个字符
publicstaticstringCutString(stringvalue,intlength,boolellipsis,CutTypecuttype)
value=value.Trim();
if(value.Length==0)
if(cuttype==CutType.NVarchar)
if(value.Length>length/2)
value=value.Substring(0,length/2);
if(ellipsis)
returnvalue+"..";
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);
returnvalue;
说实话,这个算法真的是胜之不武,别人都是通过减少拆箱和装箱来提高性能的,而它干脆连循环也不要了,让前面诸位真的无语了。
最后再介绍一个截短字符串的方法:
///截短字串的函数
///要加工的字串
///长度
///被加工过的字串
publicstaticstringLeft(stringmText,intbyteCount)
if(byteCount<1)
returnmText;
if(System.Text.Encoding.Default.GetByteCount(mText)<=byteCount)
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';elsesArr[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(lengthlength=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);Listlist=newList();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());} //////要截取的字节数//////输入的字符串///限定长度///是否需要省略号,true--需要,false--不需要///截取类型///截取后的字符串,如果是NVarchar--则20个字节就会有10个字符,Varchar--20个字节会有>=10个字符publicstaticstringCutString(stringvalue,intlength,boolellipsis,CutTypecuttype){value=
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)
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(lengthlength=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);Listlist=newList();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());} //////要截取的字节数//////输入的字符串///限定长度///是否需要省略号,true--需要,false--不需要///截取类型///截取后的字符串,如果是NVarchar--则20个字节就会有10个字符,Varchar--20个字节会有>=10个字符publicstaticstringCutString(stringvalue,intlength,boolellipsis,CutTypecuttype){value=
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();
for(inti=0;i<10000;i++)//这个用时271毫秒左右
Intercept1(s,255);
Console.WriteLine("字符串截取的方法Intercept1:
for(inti=0;i<10000;i++)//这个用时540毫秒左右
HalfSubstring(s,255);
Console.WriteLine("字符串截取的方法HalfSubstring:
for(inti=0;i<10000;i++)//这个用时1784毫秒左右
Intercept(s,255);
Console.WriteLine("按奇偶位判断的方法Intercept:
//sw.Reset();
//sw.Start();
//for(inti=0;i<10000;i++)//这个慢的吓人,我没耐心等...
//Intercept2(s,255);
//sw.Stop();
//Console.WriteLine("网友提供的方法:
Console.Read();
//这个算法用时:
for(;i{if((int)(original[i])>0xFF)--length;}if(lengthlength=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);Listlist=newList();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());} //////要截取的字节数//////输入的字符串///限定长度///是否需要省略号,true--需要,false--不需要///截取类型///截取后的字符串,如果是NVarchar--则20个字节就会有10个字符,Varchar--20个字节会有>=10个字符publicstaticstringCutString(stringvalue,intlength,boolellipsis,CutTypecuttype){value=
//这个用时1784毫秒左右
//这个用时271毫秒左右
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);Listlist=newList();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());} //////要截取的字节数//////输入的字符串///限定长度///是否需要省略号,true--需要,false--不需要///截取类型///截取后的字符串,如果是NVarchar--则20个字节就会有10个字符,Varchar--20个字节会有>=10个字符publicstaticstringCutString(stringvalue,intlength,boolellipsis,CutTypecuttype){value=
//这个慢的吓人,我没耐心等...
//这个用时540毫秒左右
if(System.Text.Encoding.Unicode.GetByteCount(str)returnstr;byte[]bytesStr=System.Text.Encoding.Unicode.GetBytes(str);Listlist=newList();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());} //////要截取的字节数//////输入的字符串///限定长度///是否需要省略号,true--需要,false--不需要///截取类型///截取后的字符串,如果是NVarchar--则20个字节就会有10个字符,Varchar--20个字节会有>=10个字符publicstaticstringCutString(stringvalue,intlength,boolellipsis,CutTypecuttype){value=
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());} //////要截取的字节数//////输入的字符串///限定长度///是否需要省略号,true--需要,false--不需要///截取类型///截取后的字符串,如果是NVarchar--则20个字节就会有10个字符,Varchar--20个字节会有>=10个字符publicstaticstringCutString(stringvalue,intlength,boolellipsis,CutTypecuttype){value=
value=
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1