作者:
靈感之源 來源:
博客園 發布時間: 2008-09-25 11:48 閱讀: 10512 次 推薦: 0
原文鏈接 [收藏]
摘要:高效的忽略大小寫的字符串替換(Replace)函數(多種方法比較)
[1] 高效的忽略大小寫的字符串替換(Replace)函數
[2]
高效的忽略大小寫的字符串替換(Replace)函數
前言
在開發中,我們要常和各種不同類型的信息打交道,無論是數據庫中的信息還是網絡的、甚至財務的數據,最終都可以ToString()為字符串(這個說法有點牽強)。所以我們日常常要和字符串打交道。
主題
在.NET中,不調用C++/CLI,進行字符串替換有好幾種方法:
1、最常用的,就是String實例.Replace(),但這個不能忽略大小寫。
2、System.Text.Regex(Regular Expression正則表達式),大家都估計到它的效率不高,雖然它支持忽略大小寫。
3、String.SubString()循環,查找要替換的子字符串的位置,截取,然后字符串相加,大家也估計到,數量少(在codeproject.com上曾有文章討論過和StringBuilder的臨屆值是600次)的情況下會比StringBuilder快。
4、跟3一樣,唯一區別就是字符累加用StringBuilder,數量少的情況下比字符累加要慢,但過了臨屆值就要快。
5、引用Microsoft VisualBasic RunTime(Microsoft.VisualBasic.DLL),里面有一個Strings.Replace,效率非常高,其原理就是:Split()再Join(),其中Split支持忽略大小寫的秘訣就是調用了System.Globalization.CultureInfo,也就是所謂的國際化,其實要實現字符串的替換代碼量不多,但要兼容各種語言(非編程語言,是交流語言),那就得多花幾倍的代碼了。
6、不想用VB運行庫的朋友,可以用Reflector配合Denis Bauer's Reflector.FileDisassembler把Microsoft.VisualBasic.DLL中的Strings的Replace和相關函數抽取出來(C#),然后修補一下就可以單獨使用了(我這明顯是吃飽了撐著,VB專家裝配腦袋指出我這是浪費時間,因為本身Microsoft VisualBasic運行庫就包括在.NET Framework中)。
實戰
以下是測試代碼:
static void Main(string[] args)

{
string segment = "中華aBc共和國";
string source;
string pattern = "abc";
string destination = "人民";
string result = "";
const long count = 1000;
StringBuilder pressure = new StringBuilder();
HiPerfTimer time;

for (int i = 0; i < count; i++)

{
pressure.Append(segment);
}
source = pressure.ToString();
//regexp
time = new HiPerfTimer();
time.Start();
for (int i = 0; i < count; i++)

{
result = Regex.Replace(source, pattern, destination,
RegexOptions.IgnoreCase);
}
time.Stop();

Console.WriteLine("regexp =" + time.Duration + ":");


//vb
time = new HiPerfTimer();
time.Start();
for (int i = 0; i < count; i++)

{
result = Strings.Replace(source, pattern, destination, 1, -1,
CompareMethod.Text);
}
time.Stop();

Console.WriteLine("vb =" + time.Duration + ":");


//vbReplace
time = new HiPerfTimer();
time.Start();
for (int i = 0; i < count; i++)

{
result = VBString.Replace(source, pattern, destination, 1, -1,
StringCompareMethod.Text);
}
time.Stop();

Console.WriteLine("vbReplace =" + time.Duration + ":" + result);


//substring
time = new HiPerfTimer();
time.Start();
for (int i = 0; i < count; i++)

{
result = StringHelper.ReplaceText(source, pattern, destination, StringHelper.
CompareMethods.Text);
}
time.Stop();

Console.WriteLine("substring =" + time.Duration + ":");


//substring with stringbuilder
time = new HiPerfTimer();
time.Start();
for (int i = 0; i < count; i++)

{
result = StringHelper.ReplaceTextB(source, pattern, destination,
StringHelper.CompareMethods.Text);
}
time.Stop();

Console.WriteLine("substringB=" + time.Duration + ":");


Console.ReadLine();
}
文章列表