2012-08-10 118 views
1

我看了这篇文章,看看我是否可以用它作为一个起点,但我没有看到它解决了我的特定问题。 C#: N For Loops不知道如何在C#中循环遍历(n)嵌套对象的数量。

我有以下代码:

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和标准[]数组。我可以通过这个循环来获取每个Criteria对象所需的后续内容,正如你所看到的我正在做的那样。

我也在深入研究第二层次,所以SearchCriteria.Criteria [n] .Criteria [n]我可以放置一个for循环并抓取任何嵌套值。

我弄不清楚的部分是如何解释可变数量的嵌套Criteria对象?我可能有这样的:

SearchCriteria.Criteria[n].Criteria[n] ... (repeat a hundred times)... .Criteria[n] 

因此,它可以具有嵌套的对象的潜在的无限数量,和同级对象(标准[0],标准[1] ...标准的无限数量[100000]是我的意思是)。

有没有一种方法可以循环所有这些?我听说一个递归循环可能是答案,我隐约明白这个概念,但我不知道的是我怎样才能得到孩子和兄弟姐妹的数量?

+0

请将'Count()'的值存储到一个变量中......当您没有修改内容的危险时,您不必经常调用它。 – TheZ 2012-08-10 20:33:48

+0

更改了代码,这只是一个粗略的,试图让它工作示例,因此我只是每次调用它。 – ledgeJumper 2012-08-10 20:35:55

回答

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 ... 

我不知道有关新线在那里,你可以添加/删除以后他们

+0

谢谢,这个对我来说最有意义。由于我的大脑难以掌握我在这里需要做的事情,所以必须坐下来完成这一切。我有种感觉,我只需要思考如何递归遍历所有的孩子和兄弟姐妹,以及以什么顺序去做。伟大的开始,但谢谢! – ledgeJumper 2012-08-10 21:06:27

5

递归循环的基本概念定义如下。你将被限制在堆栈上可用的空间。

private String GetSearchCriteria(Citeria root) { 

    String result = root.Display; 

    foreach (Criteria child in root.Criteria) { 
    result += GetSearchCriteria(child); 
    } 

    return result; 

} 
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); 
} 

字符串concatenation不是很理想,我的例子没有正确格式化...但希望你明白了。