知识大全 不定循环的字符串格式化
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
相关参考