知识大全 不定循环的字符串格式化

Posted

篇首语:要让事情改变,先改变自己;要让事情变得更好,先让自己变得更强。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 不定循环的字符串格式化相关的知识,希望对你有一定的参考价值。

  最近做的项目(自己练练手的那种)遇到了一个很有趣的问题 比如这样一个字符串 field /field /field 当然这里的field个数是不确定的 但是每一个field都知道其范围 要实现的功能就是把所有的url计算出来

  如果field的个数确定 你大可放心地用for循环 不断地嵌套就可以实现 但是这里是不确定的 我想到的方案是使用Stack 用Stack来模拟嵌套的for循环

  首先为field建个模型 说白了就是写了class表示它

  view sourceprint? public class RangeItem

  

        private int position = ;

        /// <summary>

        /// 对应的field位置

        /// </summary>

        public int Position

       

            get return position;

            set position = value;

       

        private int rangeMin = ;

        /// <summary>

        /// 范围最小值

        /// </summary>

        public int RangeMin

       

            get return rangeMin;

            set rangeMin = value;

       

        private int rangeMax = ;

        /// <summary>

        /// 范围最大值

        /// </summary>

        public int RangeMax

       

            get return rangeMax;

            set rangeMax = value;

       

        private int currentIndex = ;

        /// <summary>

        /// 在Range中的位置 这个属性用于在循环中保存当前的处理序号 因为我们在用Stack模拟嵌套的for循环

        /// </summary>

        public int CurrentIndex

       

            get return currentIndex == ? rangeMin : currentIndex;

            set currentIndex = value;

       

  

  然后呢再封装一下 把所有的RangeItem集中管理

  view sourceprint? public class RangeItemManager

  

        private static List<RangeItem> rangeItems = new List<RangeItem>();

        /// <summary>

        /// 所有的RangeItem

        /// </summary>

        public static List<RangeItem> Items

       

            get return RangeItemManager rangeItems;

            set RangeItemManager rangeItems = value;

       

  

  核心的代码如下

  view sourceprint?      if (RangeItemManager Items Count == )

            return null;

  

        RangeItemManager Items Sort(Compare);

  

        RangeItem firstItem = RangeItemManager Items[ ];

       //如果只有一个field 则简单地通过一个for处理

        if (RangeItemManager Items Count == )

            for (int i = firstItem RangeMin; i <= firstItem RangeMax; i++)

                Action(i);

        else

         //循环最外层的 对应field

            for (int i = firstItem RangeMin; i <= firstItem RangeMax; i++)

                stack = new Stack<int>();

  

                //把最外层的那个值入栈

                stack Push(i);

              //循环剩余的RangeItem

                ProcessInnerLoop( );

           

       

  

        public static int Compare(RangeItem x RangeItem y)

       

            return x Position > y Position ? : ;

       

  

        private static void ProcessInnerLoop(int current)

       

            ++current;

  

            //如果是最里层(fieldmax) 则直接进行遍历

            if (current == RangeItemManager Items Count )

                RangeItem item = RangeItemManager Items[current];

  

                for (int i = item RangeMin; i <= item RangeMax; i++)

  

                    //获取全部入栈的元素 这样算是完成了一次处理 可以产生了一个url

                    List<int> lst = stack ToList();

  

                    lst Reverse();

                    lst Add(i);

  

                    Action(lst);

               

            else

                RangeItem item = RangeItemManager Items[current];

  

                for (int i = item CurrentIndex; i <= item RangeMax; i++)

  

                    //把当前值入栈

                    stack Push(i);

  

                    //处理下一个RangeItem

                    ProcessInnerLoop(current);

  

                    //修改当前RangeItem的CurrentIndex 下一次循环是从CurrentIndex开始的

                    item CurrentIndex = i + ;

  

                    if (item CurrentIndex >= item RangeMax)

                        item CurrentIndex = item RangeMin;

  

                    //把当前值出栈

                    stack Pop();

               

           

       

  

        private static void Action(List<int> lst)

       

            object[] objs = new object[lst Count];

            for (int i = ; i < lst Count; i++)

                objs[i] = (object)lst[i];

           

  

            string url = String Format(UrlFormator objs);

          //TargetUrls Urls是一个List<string>

            TargetUrls Urls Add(url);

       

  

        private static void Action(int i)

       

            string url = String Format(UrlFormator i);

         //TargetUrls Urls是一个List<string>

            TargetUrls Urls Add(url);

       

cha138/Article/program/net/201311/11500

相关参考

知识大全 GridView实现自定义时间货币等字符串格式

GridView实现自定义时间货币等字符串格式  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  效

知识大全 Delphi把流中的字符串转换为UTF格式

Delphi把流中的字符串转换为UTF格式  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本例效

知识大全 浅析Js(Jquery)中,字符串与JSON格式互相转换的示例

浅析Js(Jquery)中,字符串与JSON格式互相转换的示例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来

知识大全 文本字符的html格式转换

  前一段仿泡泡网做了个论坛遇到了个文本符号转化成相应格式的问题自己试了几种方式搞了简单的格式转化类  网页格式转化为文本框格式  代码  publicstringEncode(stringstr) 

知识大全 Oracle基本数据类型存储格式浅析(一)-字符类型

Oracle基本数据类型存储格式浅析(一)-字符类型  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 jsp中freemarker 数字格式化

  一使用内建函数c  特点  不管其表现形式是怎样的(  例如"""""""""")  只要小数分割符是它就能转化成计算机能够识别的字符串形式而且都是计算机处理的时候是没有那些所谓的千位分隔符的(空

知识大全 Java循环与字符串代码优化

Java循环与字符串代码优化  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在系统性能优化的时候

知识大全 oracleisdate函数

  参数str 需判断的字符串fmt 时间格式化方式nls 语言  CREATEORREPLACEFUNCTIONisdate(strvarcharfmtvarchard

知识大全 编程规范-c语言的编程风格

 第一章:缩进格式  Tab是个字符于是缩进也是个字符有很多怪异的风格他们将缩进格式定义为个字符(设置为个字符!)的深度这就象试图将PI定义为一样让人难以接受  理由是:缩进的大小是为了清楚

知识大全 javascript中的escape是什么意思

  escape是什么意思?  escape采用ISOLatin字符集对指定的字符串进行编码所有的空格符标点符号特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集