class Box
{
int ChildrenCount;
Box GetChild (int index){/* some implementation*/}
public IEnumerable<Box> Children
{
get
{
for(int i = 0; i != ChildrenCount; ++i)
yield return GetChild(i);
}
}
public IEnumerable<Box> Descendants
{
get
{
foreach(Box child in Children)
{
yield return child;
foreach(Box desc in child.Descendants)
yield return desc;
}
}
}
}
Вы можете вызвать это из BoxCollection, но, поскольку Box уже является коллекцией Boxes, я не вижу цели BoxCollection здесь. В этом отношении использование Box * IEnumerable<Box>
или одного из его потомков (ICollection<Box>
, IList<Box>
), вероятно, улучшит полезность.
Также возможно сделать это итеративным, а не рекурсивным способом, который иногда имеет лучшую производительность (почти в любое время, когда компилятор в любом случае не превращает рекурсию в целое), но рекурсив более читабелен и обычно более чем исполнитель достаточно.