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

上传人:b****6 文档编号:6047703 上传时间:2023-01-03 格式:DOCX 页数:18 大小:19.75KB
下载 相关 举报
中英文字符串截取大比拼.docx_第1页
第1页 / 共18页
中英文字符串截取大比拼.docx_第2页
第2页 / 共18页
中英文字符串截取大比拼.docx_第3页
第3页 / 共18页
中英文字符串截取大比拼.docx_第4页
第4页 / 共18页
中英文字符串截取大比拼.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

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

《中英文字符串截取大比拼.docx》由会员分享,可在线阅读,更多相关《中英文字符串截取大比拼.docx(18页珍藏版)》请在冰豆网上搜索。

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

中英文字符串截取大比拼

测试程序如下:

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(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)

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);

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=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

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

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