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

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

相关参考