CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

[100分] 求教一個簡單的字符串替換處理的快速算法.

楼主IkusaHime(一品茉莉)2006-05-01 17:55:33 在 .NET技术 / C# 提问

題目:    
   
  程序中預先定義了一些變量存儲在一個   NameValueCollection   裏面,   例如:  
   
  NameValueCollection   vars   =   new   NameValueCollection();  
  vars["name"]   =   "Bush";   //   定義   name   參量為   Bush  
  vars["object"]   =   "Monkey";   //   定義   object   參量為   Monkey  
   
  然後根據這套預定義參量,   我輸入一個字符串如:   "%name%   is   %object%",   求一個快速的處理函數   string   ProcessString(string   input,   NameValueCollection   vars),   能夠把上述字符串中的變量名替換為預定義變量中的值.   (即輸出為   "Bush   is   Monkey")  
   
  ps:   本人原先用   Regex   處理,   但是速度達不到要求,   後來改成了逐   char   分析字符串手工處理,   但感覺寫出來的代碼有點長可讀性不佳,   故在此求一個比較好的算法.   thx.  
  问题点数:100、回复次数:10Top

1 楼Ivony(授人以鱼不如授人以渔,上海谋生)回复于 2006-05-01 17:58:40 得分 0

尝试StringBuilder的Replace方法,尽管Regex效率很高,但是没有编译的动态生成的Regex和以及多次体会会让它效率下降不少的……。  
   
  如果还觉得满,就只好祭出unsafe和C++   Native的大旗了。Top

2 楼IkusaHime(一品茉莉)回复于 2006-05-01 18:05:29 得分 0

我的原始代碼如下,   感覺很蹩腳   ...   求改進算法.  
   
          public   static   string   ParseString(string   input,   NameValueCollection   vars)   {  
              if   (string.IsNullOrEmpty(input))   {   return   "";   }  
   
              StringBuilder   var   =   new   StringBuilder(16);  
              StringBuilder   result   =   new   StringBuilder(input.Length);  
              int   flag   =   0;  
   
              for   (int   i   =   0;   i   <   input.Length;   i++)   {  
                  char   c   =   input[i];  
                  if   (flag   <   1)   {  
                      if   (c   !=   '%')   {  
                          result.Append(c);  
                      }   else   {  
                          flag   =   1;  
                          continue;  
                      }  
                  }   else   {  
                      if   (c   !=   '%')   {  
                          var.Append(c);  
                      }   else   {  
                          string   search   =   var.ToString();  
                          string   replace   =   vars[search];  
                          result.Append(replace);  
                          var.Length   =   0;  
                          flag   =   0;  
                          continue;  
                      }  
                  }  
              }  
   
              return   result.ToString();  
          }Top

3 楼insiderc()回复于 2006-05-01 18:31:01 得分 0

把%   换成<>好处理,如"<Name>   is   <Object>"  
  1步:来获取"<Name>",余下"   is   <Object>"  
            处理"<Name>"为"Name"  
            retStr=vars["Name"]  
  2   步:从余下"   is   <Object>"中截取"<Object>"  
            retStr="   is   "  
            处理"<Object>"为"Object"  
            retStr=vars["Object"]  
  3   步:返回retStrTop

4 楼IkusaHime(一品茉莉)回复于 2006-05-01 18:37:53 得分 0

樓上的兄弟你的意思我還不太明白,   爲什麽   <   比   %   要好處理   ?Top

5 楼IkusaHime(一品茉莉)回复于 2006-05-01 22:57:40 得分 0

顶一下   ....Top

6 楼EmotionalIntelligenc(听海(廷海))回复于 2006-05-01 23:10:49 得分 0

其实正则表达式就可以了啊   要是自己想写的话就用kmp算法或者起改进的算法就可以了啊Top

7 楼Knight94(愚翁)回复于 2006-05-02 09:06:36 得分 0

Have   a   try!  
   
  const   string   STRING_FORMAT   =   "{0}   is   {1}";  
   
  private   string   FormatString(   object[]   data   )  
  {  
        return   string.Format(   STRING_FORMAT,   data   );  
  }Top

8 楼insiderc()回复于 2006-05-02 23:34:54 得分 0

愚翁的是作为定式用,不能动态咧,不过这种定式倒是简洁,值得学习Top

9 楼webwait(webwei)回复于 2006-05-03 00:35:27 得分 0

markTop

10 楼IkusaHime(一品茉莉)回复于 2006-05-06 15:26:24 得分 0

string.Format   中的变量好像要按照顺序填入才有效,   对本问不合.   另外   string.Format   效率也不高,   处理的时候考虑了很多东西如   cultureinfo,   formatprovider   之类的,   根本用不上.  
   
  自己想到了一个算法,   把输入字符串用   Split   按照   %   切成小段数组,   双数索引的值不变,   单数索引的值就是变量.   本方法平均效率比我   3   楼的逐字符扫描高一点点,   特殊情况下(例如字符串很长,   当中变量很少)可以快   50%   以上.  
  Top

相关问题

关键词

得分解答快速导航

  • 帖主:IkusaHime

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo