C#优化字符串操作【月儿原创】
C#優(yōu)化字符串操作
作者:清清月兒
主頁(yè):http://blog.csdn.net/21aspnet/?????????? 時(shí)間:2007.6.17
??????? 開(kāi)發(fā)中可以說(shuō)幾乎隨時(shí)會(huì)涉及到字符串處理,本人覺(jué)得很有必要把平時(shí)遇到的問(wèn)題和大家一起討論,如果大家有好的見(jiàn)解和心得請(qǐng)留言和大家分享。
1.Convert.ToInt32與Int32.Parse的恩恩怨怨
2.Split的3種用法
3.@"abc"和"abc"區(qū)別在那里
4.保留2位有效小數(shù)及四舍五入
5.url傳遞中文的解決方案
6.把123456789轉(zhuǎn)換為12-345-6789的3種方法
7.交換兩個(gè)指定位置字符的4種方法
8.“%10”的妙用
9.輸出21個(gè)AAAAAAAAAAAAAAAAAAAAA的巧妙做法
1.Convert.ToInt32與Int32.Parse的恩恩怨怨
這2個(gè)方法都可以把把string解析為int,那么我們一定會(huì)有疑問(wèn):到底他們有什么區(qū)別?什么時(shí)候該用什么?性能如何等等。
其實(shí)在2.0里還有Int32.TryParse也實(shí)現(xiàn)了同樣的效果。
using?System;
using?System.Collections.Generic;
using?System.Text;
namespace?ConsoleApplication1
...{
????class?Program
????...{
????????static?void?Main(string[]?args)
????????...{
????????????string?myString?=?"1234";
????????????int?myint?=?0;
????????????myint?=?Convert.ToInt32(myString);
????????????Console.Write(myint+"/r/n ");
????????????myint?=?Int32.Parse(myString);
????????????Console.Write(myint+"/r/n ");
????????????Int32.TryParse(myString,?out?myint);
????????????Console.Write(myint+"/r/n");
????????}
????}
}
?
表面上看,可見(jiàn)3個(gè)方法都實(shí)現(xiàn)了同樣的效果!
那么我們把代碼改一下:
??????????? //string myString = "1234";
??????????? string myString = null;
??????????? int myint = 0;
??????????? myint = Convert.ToInt32(myString);
??????????? Console.Write(myint+"/r/n");
??????????? myint = Int32.Parse(myString);
??????????? Console.Write(myint+"/r/n");
??????????? Int32.TryParse(myString, out myint);
??????????? Console.Write(myint+"/r/n");
這次字符串是null,那么運(yùn)行結(jié)果會(huì)怎樣呢?
這是因?yàn)槿绻馕鲥e(cuò)誤:
Convert.ToInt32()在null時(shí)不拋異常而是返回0;
Int32.Parse()要拋異常;
Int32.TryParse()不拋異常,會(huì)返回true或false來(lái)說(shuō)明解析是否成功,如果解析錯(cuò)誤,調(diào)用方將會(huì)得到0值。
由于Convert.ToInt32()在null時(shí)我們看不到Int32.TryParse()的運(yùn)行結(jié)果所以再分調(diào)試和不調(diào)試來(lái)看結(jié)果的差異:
調(diào)試:
不調(diào)試:
其實(shí)一般出bug畢竟屬于少數(shù),而且大家都會(huì)測(cè)試保證不出bug,那么我們最關(guān)心的或許就是性能。
再把代碼修改一下:
2
????????????//string?myString?=?null;//清清月兒 http://blog.csdn.net/21aspnet/
????????????int?myint?=?0;
????????????Console.Write(System.DateTime.Now.ToString()+"??"+System.DateTime.Now.Millisecond.ToString()?+?" ");
????????????for?(int?i?=?0;?i?<?1000000;i++?)
????????????...{
????????????????myint?=?Convert.ToInt32(myString1);
????????????}
????????????Console.Write(myint?+?" /r/n");
????????????Console.Write(System.DateTime.Now.ToString()?+?"??"?+?System.DateTime.Now.Millisecond.ToString()?+?"/r/n ");
????????????string?myString2?=?"1234";
????????????for?(int?i?=?0;?i?<?1000000;?i++)
????????????...{
????????????????myint?=?Int32.Parse(myString2);
????????????}
????????????Console.Write(myint?+?"/r/n ");
????????????Console.Write(System.DateTime.Now.ToString()?+?"??"?+?System.DateTime.Now.Millisecond.ToString()?+?" ");
????????????string?myString3?=?"1234";
????????????for?(int?i?=?0;?i?<?1000000;?i++)
????????????...{
????????????????Int32.TryParse(myString3,?out?myint);
????????????}
????????????Console.Write(myint?+?"/r/n ");
????????????Console.Write(System.DateTime.Now.ToString()?+?"??"?+?System.DateTime.Now.Millisecond.ToString()?+?"/r/n ");
?
我們讓3個(gè)方法執(zhí)行100萬(wàn)次轉(zhuǎn)換看毫秒的差異:
為了準(zhǔn)確多做幾次測(cè)試:
第二次
第三次
| ? | 第一次 | 第二次 | 第三次 |
| Convert.ToInt32() | 532-204=328 | 1163-750=413 | 782-469=313 |
| Int32.Parse() | 844-532=312 | 360-63=297 | 1094-782=312 |
| Int32.TryParse() | 1141-844=297 | 657-360=297 | 375-94=281 |
其實(shí)我們可以得出結(jié)論:
3個(gè)方法幾乎沒(méi)有差異!
如果真要追求完美那么性能的差異是:Int32.TryParse()優(yōu)于Int32.Parse()優(yōu)于Convert.ToInt32()。
所以個(gè)人建議:.NET1.1下用Int32.Parse();.NET2.0用Int32.TryParse()。
那么為什么會(huì)這樣呢?
其實(shí)這些數(shù)據(jù)不是偶然的,因?yàn)?#xff1a;
Convert.ToInt32 會(huì)把最終的解析工作代理給 Int32.Parse;
Int32.Parse 會(huì)把最終的解析工作代理給Number.ParseInt32;
Int32.TryParse 會(huì)把最終的解析工作代理給Number.TryParseInt32。
至于其他進(jìn)制的轉(zhuǎn)換請(qǐng)參考MSDN。重載參數(shù)即可!
2.Split的3種用法
我們可以把12???? 33?? 456??? 12342? 拼起來(lái)就是一個(gè)字符,因?yàn)楹芏鄷r(shí)候我們覺(jué)得處理只有幾個(gè)組的時(shí)候用數(shù)組很麻煩所以我們用“|”或者“,”等等把他們拼起來(lái)在需要的時(shí)候用Split打散即可。//清清月兒 http://blog.csdn.net/21aspnet/
下面列舉一些用法,不做性能分析了。
方法一:
????????...{
????????????string?aa?=?"1234,234523,4324,324";//清清月兒 http://blog.csdn.net/21aspnet/
????????????string[]?cc?=?aa.Split(new?char[]?...{?','?});
????????????foreach?(string?bb?in?cc)
????????????...{
????????????????Console.Write(bb?+?"/r/n ");
????????????}
???????????
????????}
方法二:
????????????string[]?str?=?aa.Split(',');
????????????foreach?(string?bb?in?str)
????????????...{
????????????????Console.Write(bb?+?" /r/n");
????????????}
?
方法三:
????????...{
????????????string?a?=?"1,2,3,4,5,6,7,8,9";
????????????string?b?=?",";
????????????string[]?c?=?Split(a,?b);
????????????foreach?(string?bb?in?c)
????????????...{
????????????????Console.Write(bb?+?" /r/n");
????????????}
????????}
????????public?static?string[]?Split(string?input,?string?pattern)
????????...{
????????????string[]?arr?=?System.Text.RegularExpressions.Regex.Split(input,?pattern);
????????????return?arr;
????????}
實(shí)現(xiàn)把文章按空格打散:
public?static?void?Main?()?
????...{
????????string?a="While?laughter?is?is?very?aerobic?activity?engages?every?single?organ?system";
????????string?b="?";
????????string?[]c=TestDoWhile.Split(a,b);
????????foreach(string?bb?in?c)
????????...{
????????????Console.Write(bb+" /r/n");
????????}
????}
????public?static?string[]?Split(string?input,string?pattern)
????...{
????????string[]?arr?=?System.Text.RegularExpressions.Regex.Split(input,pattern);
????????return?arr;
????}
3.@"abc"和"abc"區(qū)別在那里
@"abc"和"abc"沒(méi)有什么區(qū)別
不過(guò)@是忽略轉(zhuǎn)義字符的!
比如 "abc/n" 輸出 abc 并加個(gè)換行
但是 @"abc/n" 輸出 abc/n 無(wú)換行!
取消轉(zhuǎn)義
比如你想將 C:/windows/system 這個(gè)字符串賦值給 str
一般情況下要:
string str = "C://windows//system";
因?yàn)樵贑#中,// 才會(huì)被轉(zhuǎn)義成一個(gè) /
又例如/n就是換行符
而加入@,就可以這樣:
string str = @"C:/windows/system";
4.保留2位有效小數(shù)及四舍五入
這又是一個(gè)經(jīng)常遇到的問(wèn)題。
保留2位有效小數(shù)(和保留N位一樣的參數(shù)不同而已):
????????...{
????????????Double?a?=?12.345678;
????????????Console.Write(Math.Round(a,2));
????????}
?
四舍五入:
????????...{?
????????????Double?a?=?12.345678;//是要四舍五入的數(shù)
????????????Console.Write((a*10000+0.5)/10000);
????????}
5.url傳遞中文的解決方案
1.設(shè)置web.config文件。
<system.web>
......
<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" fileEncoding="gb2312" />
......
</system.web>
2.傳遞中文之前,將要傳遞的中文參數(shù)進(jìn)行編碼,在接收時(shí)再進(jìn)行解碼。
>> 進(jìn)行傳遞
string Name = "中文參數(shù)";
Response.Redirect("B.aspx?Name="+Server.UrlEncode(Name));
>> 進(jìn)行接收
string Name = Request.QueryString["Name"];
Response.Write(Server.UrlDecode(Name));
3.如果是從 .HTML 文件向 .Aspx 文件進(jìn)行傳遞中文參數(shù)的話(即不從后臺(tái)用 Redirect()方法進(jìn)行 Url 轉(zhuǎn)換)。一樣要將傳遞的中文參數(shù)進(jìn)行編碼,在接收時(shí)再進(jìn)行解碼。
>> 進(jìn)行傳遞
<script language="JavaScript">
function GoUrl()
{
var Name = "中文參數(shù)";
location.href = "B.aspx?Name="+escape(Name);
}
</script>
<body οnclick="GoUrl()">
>> 進(jìn)行接收
string Name = Request.QueryString["Name"];
Response.Write(Server.UrlDecode(Name));
一般來(lái)說(shuō)。設(shè)置web.config文件就可以了。但是如果你用 JavaScript 調(diào)用 webservice 方法的話(往webservice里面?zhèn)鬟f中文參數(shù))。設(shè)置 web.config 文件好象無(wú)效。 //清清月兒http://blog.csdn.net/21aspnet/
6.把123456789轉(zhuǎn)換為12-345-6789的3種方法
方法一:
?
????????????a?=?int.Parse(a).ToString("##-###-####");
????????????Console.Write(a);
?
方法二:
????????????a?=?a.Insert(5,?"-").Insert(2,?"-");
????????????Console.Write(a);
方法三:
using?System;
using?System.Collections.Generic;
using?System.Text;
using?System.Text.RegularExpressions;
namespace?ConsoleApplication1
...{
????class?Program
????...{
????????static?void?Main()
????????...{
????????????string?a?=?"123456789";
????????????Regex?reg?=?new?Regex(@"^(d{2})(d{3})(d{4})$");
????????????a?=?reg.Replace(a,?"$1-$2-$3");
????????????Console.Write(a);
????????}
????????
????}
}
7.交換兩個(gè)指定位置字符的4種方法
方法一:
????????...{
????????????string?s?=?"123456789";
????????????SwapChar(ref?s,?3,?6);
????????????Console.Write(s.ToString());
????????}
????????static?void?SwapChar(ref?string?s,?int?i1,?int?i2)
????????...{
????????????char?temp?=?s[i1];
????????????char?temp1?=?s[i2];
????????????s?=?s.Remove(i1,?1).Insert(i1,?temp1.ToString());
????????????s?=?s.Remove(i2,?1).Insert(i2,?temp.ToString());
????????}
?
方法二:
????????...{
????????????string?s?=?"123456789";
????????????//SwapChar(s,?3,?6);
????????????Console.Write(SwapChar(s,?3,?6).ToString());
????????}
????????static?string?SwapChar(string?s,?int?p1,?int?p2)
????????...{
????????????if?((p1?==?p2)?||?((p1?<?0)?||?(p2?<?0)))?return?s;
????????????if?((p1?>=?s.Length)?||?(p2?>=?s.Length))?return?s;
????????????char[]?vChars?=?s.ToCharArray();
????????????vChars[p1]?=?(char)(vChars[p2]?|?(vChars[p2]?=?vChars[p1])?&?0);
????????????return?new?string(vChars);
????????}
方法三:
????????...{
????????????string?s?=?"123456789";
????????????Console.Write(SwapChar(s,?3,?6).ToString());
????????}
????????public?static?string?SwapChar(string?str,?int?a,?int?b)
????????...{
????????????char[]?newStr?=?str.ToCharArray();
????????????newStr[a]?=?str[b];
????????????newStr[b]?=?str[a];
????????????return?new?string(newStr);
????????}
?
方法四:
using?System.Collections.Generic;
using?System.Text;
using?System.Text.RegularExpressions;
namespace?ConsoleApplication1
...{
????class?Program
????...{
????????static?void?Main()
????????...{
????????????string?s?=?"123456789";
????????????Console.Write(SwapChar(s,?3,?6).ToString());
????????}
????????static?string?SwapChar(string?s,?int?p1,?int?p2)
????????...{
????????????if?(p1?>?p2)?...{?int?p?=?p1;?p1?=?p2;?p2?=?p;?}
????????????return?Regex.Replace(s,?"^(.{"?+?p1?+?"})(.)(.{"?+?(p2?-?p1?-?1)?+?"})(.)(.*)$",?"$1$4$3$2$5");
????????}
????}
}
?
8. “%10”的妙用
static?void?Main()????????...{
????????????Random?r?=?new?Random();
????????????Console.WriteLine(r.Next()?%?10);//1-9
????????????Console.WriteLine(r.Next()?%?10);
????????????Console.WriteLine(r.Next()?%?10);
????????????Console.WriteLine(r.Next()?%?10);
????????????Console.WriteLine(r.Next()?%?10);
????????????Console.WriteLine(r.Next()?%?10);
????????????Console.WriteLine(r.Next()?%?10);
????????????Console.WriteLine(r.Next()?%?10);
????????????Console.WriteLine(r.Next()?%?10);
????????}
?
9.輸出21個(gè)AAAAAAAAAAAAAAAAAAAAA的巧妙做法
new構(gòu)造器的理解
如果要你創(chuàng)建一個(gè)由21個(gè)"A"字符構(gòu)成的字符串,你會(huì)怎么做?
string str = "AAAAAAAAAAAAAAAAAAAAA";//老實(shí)型
string str = new string('A', 21);//簡(jiǎn)單聰明
10.compare()與compareTo()方法
一樣的功能,只是兩個(gè)接口的兩個(gè)方法而已 ?
? compare是Comparatable的方法,compareTo是Comparator的方法
總結(jié)
以上是生活随笔為你收集整理的C#优化字符串操作【月儿原创】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: “大都食足早宜休”上一句是什么
- 下一篇: C#的6种常用集合类大比拼【月儿原创】