1

我查看了这篇文章,看看是否可以以此为起点,但我认为它并没有解决我的特定问题。C#:N 个 For 循环

我有以下代码:

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] 就是我的意思)。

有没有办法让我遍历所有这些?我听说递归循环可能是答案,我隐约理解这个概念,但我不知道如何获得孩子和兄弟姐妹的数量?

4

3 回答 3

5

递归循环的基本概念定义如下。您将受限于堆栈上的可用空间。

private String GetSearchCriteria(Citeria root) {

  String result = root.Display;

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

  return result;

}
于 2012-08-10T20:37:10.777 回答
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  ...

我不确定那里的新行,您可以稍后添加/删除它们

于 2012-08-10T20:44:56.857 回答
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);
}

字符串连接并不理想,而且我的示例格式不正确......但希望你明白这一点。

于 2012-08-10T20:45:32.660 回答