程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C#優化字符串操作(經驗之談)

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.ToInt32與Int32.Parse的恩恩怨怨

這2個方法都可以把把string解析為int,那麼我們一定會有疑問:到底他們有什麼區別?什麼時候該用什麼?性能如何等等。

其實在2.0裡還有Int32.TryParse也實現了同樣的效果。

C# CODE

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

(運行效果將是毫無差別,圖略)

那麼我們把代碼改一下:

C# CODE

//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()的運行結果所以再分調試和不調試來看結果的差異:

調試:

(將會看到 TryParse 返回 false。圖略)

其實一般出bug畢竟屬於少數,而且大家都會測試保證不出bug,那麼我們最關心的或許就是性能。

再把代碼修改一下:

C# CODE

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個方法幾乎沒有差異!

如果真要追求完美那麼性能的差異是: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打散即可。

下面列舉一些用法,不做性能分析了。

方法一:

C# CODE

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

方法二:C# CODE

string aa = "1234,234523,4324,324";
string[] str = aa.Split(',');
foreach (string bb in str)
...{
Console.Write(bb + "\r\n");
}

方法三:C# CODE

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

實現把文章按空格打散:

C# CODE

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位一樣的參數不同而已):

C# CODE

static void Main()
{
Double a = 12.345678;
Console.Write(Math.Round(a,2));
}
//(將輸出 12.35)

四捨五入:

static void Main()
...{
      Double a = 12.345678;//是要四捨五入的數
      Console.Write((a*10000+0.5)/10000);
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved