天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

高效的忽略大小寫的字符串替換(Replace)函數(shù)

前言

在開發(fā)中,我們要常和各種不同類型的信息打交道,無論是數(shù)據(jù)庫中的信息還是網(wǎng)絡(luò)的、甚至財務(wù)的數(shù)據(jù),最終都可以ToString()為字符串(這個說法有點牽強)。所以我們?nèi)粘3R妥址蚪坏馈?/p>

主題

在.NET中,不調(diào)用C++/CLI,進(jìn)行字符串替換有好幾種方法:

1、最常用的,就是String實例.Replace(),但這個不能忽略大小寫。

2、System.Text.Regex(Regular Expression正則表達(dá)式),大家都估計到它的效率不高,雖然它支持忽略大小寫。

3、String.SubString()循環(huán),查找要替換的子字符串的位置,截取,然后字符串相加,大家也估計到,數(shù)量少(在codeproject.com上曾有文章討論過和StringBuilder的臨屆值是600次)的情況下會比StringBuilder快。

4、跟3一樣,唯一區(qū)別就是字符累加用StringBuilder,數(shù)量少的情況下比字符累加要慢,但過了臨屆值就要快。

5、引用Microsoft VisualBasic RunTime(Microsoft.VisualBasic.DLL),里面有一個Strings.Replace,效率非常高,其原理就是:Split()再Join(),其中Split支持忽略大小寫的秘訣就是調(diào)用了System.Globalization.CultureInfo,也就是所謂的國際化,其實要實現(xiàn)字符串的替換代碼量不多,但要兼容各種語言(非編程語言,是交流語言),那就得多花幾倍的代碼了。

6、不想用VB運行庫的朋友,可以用Reflector配合Denis Bauer's Reflector.FileDisassembler把Microsoft.VisualBasic.DLL中的Strings的Replace和相關(guān)函數(shù)抽取出來(C#),然后修補一下就可以單獨使用了(我這明顯是吃飽了撐著,VB專家裝配腦袋指出我這是浪費時間,因為本身Microsoft VisualBasic運行庫就包括在.NET Framework中)。

實戰(zhàn)

以下是測試代碼:

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

說明

這個代碼演示了上述幾種方法:要把字符串"中華aBc共和國"中的"abc"替換為"人民",注意:源子字符串是"aBc",要替換的是"abc",這里目的是要測試不區(qū)分大小寫。

為了測試效率,我特意先把測試字符串累加1000次,然后循環(huán)測試1000次。

結(jié)果

以下是測試結(jié)果:

regexp =1.38308285017339 //這是正則表達(dá)式,第4快;

vb =0.525978828344589 //這是引用Microsoft VisualBasic RunTime的,次快;

vbReplace=0.522997341400086 //這就是用reflector改為C#的,最快;

substring =21.8573638474698 //這是string.substring +,最慢

substringB=14.6346693500287 //這是string.substring StringBuilder,次慢,這里凸現(xiàn)了StringBuilder的速度;

這里僅僅是多次測試中的一次,我沒有弄平均,大概數(shù)字吧,到底是vb快還是reflector的c#快,差不多...

是否應(yīng)該使用Microsoft VisualBasic RunTime就見仁見智了。

后話

不過裝配腦袋指出,“可以使用C++的std::basic_string::replace”實現(xiàn)高效的字符串替換。

資源下載

限于篇幅,具體的代碼,請點擊這里下載。

NET技術(shù)高效的忽略大小寫的字符串替換(Replace)函數(shù),轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 最近2019中文字幕免费 | 1300部真实小Y女视频合集 | 菠萝菠萝蜜视频在线看1 | 欧美黄色第一页 | 善良的小峓子2在钱中文版女主角 | 蜜桃视频一区二区 | 欧美性XXXXX极品娇小 | 国产 亚洲 中文在线 字幕 | 亚洲二区电影 | 野花视频在线观看免费最新动漫 | 亚洲精品视频免费观看 | 强壮的公次次弄得我高潮韩国电影 | 国产乱码精品一区二区三区四川 | 肉伦禁忌小说np | 色综合久久中文色婷婷 | 一边亲着一面膜下的免费过程 | 漂亮的av女演员 | 青柠在线观看视频在线高清完整 | 久久久国产精品免费A片蜜臀 | 性绞姿始动作动态图 | 拍床戏被肉高H纯肉H在水 | 97国内精品久久久久久久影视 | 亚洲一区二区影院 | 青苹果乐园在线观看电视剧 | bl(高h)文 | 天天综合亚洲综合网站 | 麻豆精品2021最新 | 欧美v1deossexo高清 | 国产香蕉尹人视频在线 | 在线自拍亚洲视频欧美 | 国产亚洲精品久久久久久入口 | 皮皮在线精品亚洲 | 日韩内射美女人妻一区二区三区 | 亚洲欧美中文字幕5发布 | 3DNagoonimation动漫 | 男宿舍里的呻吟h | 无码人妻精品一区二区蜜桃色 | 伊人色综合久久大香 | 在线亚洲精品福利网址导航 | 麻豆成人AV久久无码精品 | 国产 高清 无码 中文 |