C#優化字符串操作

C#優化字符串操作

 

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.ToInt32Int32.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;//清清月兒 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個方法執行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";//清清月兒 http://blog.csdn.net/21aspnet/
            
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 οnclick="GoUrl()">
>> 進行接收
string Name = Request.QueryString["Name"];
Response.Write(Server.UrlDecode(Name));

一般來說。設置web.config文件就可以了。但是如果你用 JavaScript 調用 webservice 方法的話(往webservice裏面傳遞中文參數)。設置 web.config 文件好象無效。 //清清月兒http://blog.csdn.net/21aspnet/

6.把123456789轉換爲12-345-6789的3種方法

方法一:
 

            string a = "123456789";
            a 
= int.Parse(a).ToString("##-###-####");
            Console.Write(a);

 

方法二:

string a = "123456789";
            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.交換兩個指定位置字符的4種方法

方法一:

static void Main()
        
{
            
string s = "123456789";
            SwapChar(
ref s, 36);
            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());
        }

 

方法二:

 static void Main()
        
{
            
string s = "123456789";
            
//SwapChar(s, 3, 6);
            Console.Write(SwapChar(s, 36).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);
        }

方法三:

static void Main()
        
{
            
string s = "123456789";
            Console.Write(SwapChar(s, 
36).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;
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, 
36).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個AAAAAAAAAAAAAAAAAAAAA的巧妙做法

new構造器的理解
如果要你創建一個由21個"A"字符構成的字符串,你會怎麼做?
string str = "AAAAAAAAAAAAAAAAAAAAA";//老實型
string str = new string(
'A', 21);//簡單聰明

10.compare()與compareTo()方法

一樣的功能,只是兩個接口的兩個方法而已  
  compare是Comparatable的方法,compareTo是Comparator的方法

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章