CategoryItem にその子のリストが含まれていない場合 (質問の最初のバージョンのように)、まず foreach CategoryID がすべてのサブカテゴリ項目を提供する辞書を作成し、この辞書を使用してすべての項目を再帰的に出力します。親が「0」のアイテムから始めます。Print が項目に関連付けられたデータを印刷する命令であり、唯一のパラメーターとしてインデントのレベルを受け取ると仮定すると、コードは次のようになります。
public static void PrintItems(List<CategoryItem> items)
{
Dictionary<string, List<CategoryItem>> dictOfChildren = new Dictionary<string, List<CategoryItem>>();
// loop through all the items grouping them according to their ParentID
foreach (CategoryItem anItem in items)
{
List<CategoryItem> children;
if (!dictOfChildren.TryGetValue(anItem.ParentID, out children))
{
children = new List<CategoryItem>();
dictOfChildren[anItem.ParentID] = children;
}
children.Add(anItem);
}
// recursively print all the items starting from the ones with ParentID = 0
// the dictionary is passed to the method in order to be able to find the children of each item
PrintItems(dictOfChildren["0"], dictOfChildren, 0);
}
private static void PrintItems(List<CategoryItem> list, Dictionary<string, List<CategoryItem>> dictOfChildren, int levelOfIndentation)
{
foreach (CategoryItem anItem in list)
{
// first print the current item
anItem.Print(levelOfIndentation);
// then recursively print all its children
List<CategoryItem> children;
if (dictOfChildren.TryGetValue(anItem.CategoryID, out children) &&
children.Count > 0)
PrintItems(children, dictOfChildren, levelOfIndentation + 1);
}
}
これは実際にはオブジェクト指向ではありませんが、従うべき方向についてのヒントが得られるはずです。
編集:
質問を編集し、SubCategory プロパティを追加したことがわかりました。これにより、物事がはるかに簡単になり、簡単に実行できます。
public static void PrintItems(List<CategoryItem> items)
{
// call a recursive method passing 0 as level of indentation
PrintItems(items, 0);
}
public static void PrintItems(List<CategoryItem> items, int levelOfIndentation)
{
foreach (CategoryItem anItem in items)
{
// print the currentItem
anItem.Print(levelOfIndentation);
// increment the level of indentation and callk the same method for the children
PrintItems(anItem.SubCategory, levelOfIndentation + 1);
}
}