我查看了这篇文章,看看我是否可以将其作为起点,但我不认为它解决了我的特殊问题。 C#: N For Loops
我有以下代码:
int criteriaCount = rule.SearchCriteria.Criteria.Count();
string criteria = "";
for (int i = 0; i < criteriaCount; i++)
{
if (rule.SearchCriteria.Criteria[i].Criteria.Count() > 0)
{
criteria += string.Format("({0}" + System.Environment.NewLine, rule.SearchCriteria.Criteria[i].Display);
criteria += string.Format("{0})" + System.Environment.NewLine, rule.SearchCriteria.Criteria[i].Criteria[i].Display);
}
else
{
criteria += string.Format("[{0}]" + System.Environment.NewLine, rule.SearchCriteria.Criteria[i].Display);
}
}
为了解释一下,你有SearchCriteria和Array of Criteria []。我可以遍历这个并从每个Criteria对象中获取我需要的跟随,你可以看到我在做什么。
我也在深入研究二级,所以SearchCriteria.Criteria [n] .Criteria [n]和我可以放置一个for循环,并在那里抓取任何嵌套值。
我无法弄清楚的部分是如何解释可变数量的嵌套Criteria对象?我可能有这个:
SearchCriteria.Criteria[n].Criteria[n] ... (repeat a hundred times)... .Criteria[n]
所以它可能有无限数量的嵌套对象,以及无数个兄弟对象(Criteria [0],Criteria [1] ...... Criteria [100000]就是我的意思)。
有没有办法可以循环使用这一切?我听说过一个递归循环可能就是答案,我模糊地理解这个概念,但我不知道的是我怎样才能得到孩子和兄弟姐妹的数量?
答案 0 :(得分:5)
递归循环的基本概念定义如下。您将被限制在堆栈中可用的空间。
private String GetSearchCriteria(Citeria root) {
String result = root.Display;
foreach (Criteria child in root.Criteria) {
result += GetSearchCriteria(child);
}
return result;
}
答案 1 :(得分:2)
使用递归,在你的情况下,你可以使用这样的东西......
private static string DisplayCriteria(Criteria criteriaObject)
{
string criteria = "";
foreach(Criteria c in criteriaObject)
{
if (c.Criteria.Count() > 0)
{
criteria += string.Format("({0}" + System.Environment.NewLine, c.Display);
criteria += string.Format("{0})" + System.Environment.NewLine, DisplayCriteria(c.Criteria));
}
else
{
criteria += string.Format("[{0}]" + System.Environment.NewLine, c.Display);
}
}
return criteria;
}
// your code ...
DisplayCriteria(rule.SearchCriteria.Criteria);
// your code ...
我不确定那里的新行,你可以稍后添加/删除它们
答案 2 :(得分:1)
你需要将你的方法变成一个“递归方法”......一种调用自身来处理无限嵌套的方法,例如:
public string ParseCriteria( Criteria criteria ) {
string result = "(";
result += criteria.Display;
foreach( var criteria in criteria.Criteria) {
result += ParseCriteria( criteria )
}
return result;
}
然后,在现有代码中就是这样的。
foreach( var criteria in rule.SearchCriteria.Criteria ) {
string result += ParseCriteria(criteria);
}
字符串连接并不理想,我的例子格式不正确...但希望你能得到这个想法。