轉自 http://www.companysz.com/candywyq/archive/2007/07/24/830021.html
1.Convert.ToInt32與Int32.Parse的恩恩怨怨
2.Split的3種用法
3.@"abc"和"abc"區別在那里
4.保留2位有效小數及四舍五入
5.url傳遞中文的解決方案
6.把123456789轉換為12-345-6789的3種方法
7.交換兩個指定位置字符的4種方法
8.“%10”的妙用
9.輸出21個AAAAAAAAAAAAAAAAAAAAA的巧妙做法
1.Convert.ToInt32與Int32.Parse的恩恩怨怨
這2個方法都可以把把string解析為int,那么我們一定會有疑問:到底他們有什么區別?什么時候該用什么?性能如何等等。
其實在2.0里還有Int32.TryParse也實現了同樣的效果。
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"); } }}
表面上看,可見3個方法都實現了同樣的效果!
那么我們把代碼改一下:
//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,那么運行結果會怎樣呢?
這是因為如果解析錯誤: Convert.ToInt32()在null時不拋異常而是返回0; Int32.Parse()要拋異常; Int32.TryParse()不拋異常,會返回true或false來說明解析是否成功,如果解析錯誤,調用方將會得到0值。
由于Convert.ToInt32()在null時我們看不到Int32.TryParse()的運行結果所以再分調試和不調試來看結果的差異:
調試:
不調試:
其實一般出bug畢竟屬于少數,而且大家都會測試保證不出bug,那么我們最關心的或許就是性能。
再把代碼修改一下: 2
string myString1 = "1234"; //string myString = null; 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個方法執行100萬次轉換看毫秒的差異:
為了準確多做幾次測試:
第二次
第三次
第一次 | 第二次 | 第三次 | |
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 |
其實我們可以得出結論:
3個方法幾乎沒有差異! 如果真要追求完美那么性能的差異是:Int32.TryParse()優于Int32.Parse()優于Convert.ToInt32()。 所以個人建議:.NET1.1下用Int32.Parse();.NET2.0用Int32.TryParse()。
那么為什么會這樣呢? 其實這些數據不是偶然的,因為: Convert.ToInt32 會把最終的解析工作代理給 Int32.Parse; Int32.Parse 會把最終的解析工作代理給Number.ParseInt32; Int32.TryParse 會把最終的解析工作代理給Number.TryParseInt32。
至于其他進制的轉換請參考MSDN。重載參數即可!
2.Split的3種用法
我們可以把12 33 456 12342 拼起來就是一個字符,因為很多時候我們覺得處理只有幾個組的時候用數組很麻煩所以我們用“|”或者“,”等等把他們拼起來在需要的時候用Split打散即可。//清清月兒 http://blog.csdn.net/21aspnet/
下面列舉一些用法,不做性能分析了。
方法一:
static void Main(string[] args) { string aa = "1234,234523,4324,324"; string[] cc = aa.Split(new char[] { ',' }); foreach (string bb in cc) { Console.Write(bb + "/r/n "); } }
方法二:
string aa = "1234,234523,4324,324";string[] str = aa.Split(','); foreach (string bb in str) { Console.Write(bb + " /r/n");}
方法三:
static void Main(string[] args) { 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; }
實現把文章按空格打散:
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"區別在那里 @"abc"和"abc"沒有什么區別
不過@是忽略轉義字符的! 比如 "abc/n" 輸出 abc 并加個換行 但是 @"abc/n" 輸出 abc/n 無換行! 取消轉義
比如你想將 C:/windows/system 這個字符串賦值給 str
一般情況下要: string str = "C://windows//system";
因為在C#中,// 才會被轉義成一個 / 又例如/n就是換行符
而加入@,就可以這樣:
string str = @"C:/windows/system";
4.保留2位有效小數及四舍五入 這又是一個經常遇到的問題。
保留2位有效小數(和保留N位一樣的參數不同而已):
static void Main() { Double a = 12.345678; Console.Write(Math.Round(a,2)); }
四舍五入:
static void Main() { Double a = 12.345678;//是要四舍五入的數 Console.Write((a*10000+0.5)/10000); }
5.url傳遞中文的解決方案
1.設置web.config文件。 <system.web> ...... <globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" fileEncoding="gb2312" /> ...... </system.web>
2.傳遞中文之前,將要傳遞的中文參數進行編碼,在接收時再進行解碼。 >> 進行傳遞 string Name = "中文參數"; Response.Redirect("B.aspx?Name="+Server.UrlEncode(Name)); >> 進行接收 string Name = Request.QueryString["Name"]; Response.Write(Server.UrlDecode(Name));
3.如果是從 .HTML 文件向 .Aspx 文件進行傳遞中文參數的話(即不從后臺用 Redirect()方法進行 Url 轉換)。一樣要將傳遞的中文參數進行編碼,在接收時再進行解碼。 >> 進行傳遞 <script language="javaScript"> function GoUrl() { var Name = "中文參數"; location.href = "B.aspx?Name="+escape(Name); } </script> <body onclick="GoUrl()"> >> 進行接收 string Name = Request.QueryString["Name"]; Response.Write(Server.UrlDecode(Name));
一般來說。設置web.config文件就可以了。但是如果你用 Javascript 調用 webservice 方法的話(往webservice里面傳遞中文參數)。設置 web.config 文件好象無效。
6.把123456789轉換為12-345-6789的3種方法方法一:
新聞熱點
疑難解答