解析.NET中字符串替換的五種方法_.Net教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:.NET教程之--.NET動態創建類的實例解析
      看了網上很多關于DotNet動態創建類的實例的文章,我這里想總結一下,其實方法很簡單,就是用“Activator.CreateInstance”。但是這個方法需要待創建的類的Type作為參數,為了獲

      1:使用String.Replace函數替換,但不支持大小寫。

      2:正則System.Text.Regex替換,用RegExpOption修改是否支持大小寫。

      3:在小數據的情況下,使用String.SubString和 可以實現間接替換。

      4:導入MicrosoftVisualBasicRunTime(Microsoft.VisualBasic.DLL)使用Strings.Replace速度很快。

      5:參照反射Reflector.FileDisassembler配合Strings.SplitandStrings.Join等實現,速度同5。

      一下介紹一種算法,類似KMP算法。有興趣的參照研究下。

      以下為引用的內容:
      privatestaticstringReplaceEx(stringoriginal,
                stringpattern,stringreplacement)
      {
        intcount,position0,position1;
        count=position0=position1=0;
        stringupperString=original.ToUpper();
        stringupperPattern=pattern.ToUpper();
        intinc=(original.Length/pattern.Length)*
             (replacement.Length-pattern.Length);
        char[]chars=newchar[original.Length Math.Max(0,inc)];
        while((position1=upperString.IndexOf(upperPattern,
                         position0))!=-1)
        {
          for(inti=position0;i<position1; i)
            chars[count ]=original[i];
          for(inti=0;i<replacement.Length; i)
            chars[count ]=replacement[i];
          position0=position1 pattern.Length;
        }
        if(position0==0)returnoriginal;
        for(inti=position0;i<original.Length; i)
          chars[count ]=original[i];
        returnnewstring(chars,0,count);
      }

      測試

      以下為引用的內容:
      staticvoidMain(string[]args)
      {
        stringsegment="AaBbCc";
        stringsource;
        stringpattern="AbC";
        stringdestination="Some";
        stringresult="";
        
        constlongcount=1000;
        StringBuilderpressure=newStringBuilder();
        HiPerfTimertime;
        for(inti=0;i<count;i )
        {
          pressure.Append(segment);
        }
        source=pressure.ToString();
        GC.Collect();
        //regexp
        time=newHiPerfTimer();
        time.Start();
        for(inti=0;i<count;i )
        {
          result=Regex.Replace(source,pattern,
               destination,RegexOptions.IgnoreCase);
        }
        time.Stop();
        Console.WriteLine("regexp  =" time.Duration "s");
        GC.Collect();
        //vb
        time=newHiPerfTimer();
        time.Start();
        for(inti=0;i<count;i )
        {
          result=Strings.Replace(source,pattern,
               destination,1,-1,CompareMethod.Text);
        }
        time.Stop();
        Console.WriteLine("vb    =" time.Duration "s");
        GC.Collect();
        //vbReplace
        time=newHiPerfTimer();
        time.Start();
        for(inti=0;i<count;i )
        {
          result=VBString.Replace(source,pattern,
               destination,1,-1,StringCompareMethod.Text);
        }
        time.Stop();
        Console.WriteLine("vbReplace=" time.Duration "s");// result);
        GC.Collect();
        //ReplaceEx
        time=newHiPerfTimer();
        time.Start();
        for(inti=0;i<count;i )
        {
          result=Test.ReplaceEx(source,pattern,destination);
        }
        time.Stop();
        Console.WriteLine("ReplaceEx=" time.Duration "s");
        GC.Collect();
        //Replace
        time=newHiPerfTimer();
        time.Start();
        for(inti=0;i<count;i )
        {
          result=source.Replace(pattern.ToLower(),destination);
        }
        time.Stop();
        Console.WriteLine("Replace =" time.Duration "s");
        GC.Collect();
        //sorry,twoslow:(
        /*//substring
        time=newHiPerfTimer();
        time.Start();
        for(inti=0;i<count;i )
        {
          result=StringHelper.ReplaceText(source,pattern,
               destination,StringHelper.CompareMethods.Text);
        }
        time.Stop();
        Console.WriteLine("substring=" time.Duration ":");
        GC.Collect();
        //substringwithstringbuilder
        time=newHiPerfTimer();
        time.Start();
        for(inti=0;i<count;i )
        {
          result=StringHelper.ReplaceTextB(source,pattern,
                destination,StringHelper.CompareMethods.Text);
        }
        time.Stop();
        Console.WriteLine("substringB=" time.Duration ":");
        GC.Collect();
        */
        Console.ReadLine();
      }
      1?¢stringsegment="abcaBc";
      regexp=3.75481827997692s
      vb=1.52745502570857s
      vbReplace=1.46234256029747s
      ReplaceEx=0.797071415501132s!!!<FONTcolor=gray>Replace=0.178327413120941s</FONT>
      //ReplaceEx>vbReplace>vb>regexp
      2?¢stringsegment="abcaBcabC";
      regexp=5.30117431126023s
      vb=2.46258449048692s
      vbReplace=2.5018721653171s
      ReplaceEx=1.00662179131705s!!!
      <FONTcolor=gray>Replace=0.233760994763301s</FONT>
      //ReplaceEx>vb>vbReplace>regexp
      3?¢stringsegment="abcaBcabCAbc";
      regexp=7.00987862982586s
      vb=3.61050301085753s
      vbReplace=3.42324876485699s
      ReplaceEx=1.14969947297771s!!!
      <FONTcolor=gray>Replace=0.277254511397398s</FONT>
      //ReplaceEx>vbReplace>vb>regexp
      4?¢stringsegment="ABCabcAbCaBcAbcabCABCAbcaBC";
      regexp=13.5940090151123s
      vb=11.6806222578568s
      vbReplace=11.1757614445411s
      ReplaceEx=1.70264153684337s!!!(mygod!)
      <FONTcolor=gray>Replace=0.42236820601501s</FONT>
      //ReplaceEx>vbReplace>vb>regexp

      查看程序的Block在:

      以下為引用的內容:

      stringupperString=original.ToUpper();
      stringupperPattern=pattern.ToUpper();

      如果需要敏感,就免了這2行。

      解釋:先建一個char[]類型的變量采訪替換后的字符,其大小就是最大可能被替換的字符,例如ABABAB,替換AB成C,其獲取過程就是ABABAB最大可能包括的AB的數目乘以AB多于C的數目,

      以下為引用的內容:

        char[]chars=newchar[original.Length Math.Max(0,inc)];

        ,inc不一定大于零。

      然后循環,用IndexOf索引。賦值。。。判斷,返回。

      分享:解析.Net編程接口剖析系列之比較和排序
      我們知道,與C 相比較,C#以及整個.Net并不支持多繼承,而相應的,C#支持了接口,并且支持一個類型實現多個接口。對于接口的概念,相信大部分讀者已經有了很好的了解,而我這里談談個人對

      來源:模板無憂//所屬分類:.Net教程/更新時間:2009-09-02
      相關.Net教程