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 オブジェクトから必要なフォローを取得できます。

私は第 2 レベルも深く見ているので、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 に答える