Ist es möglich, ein rekursives IEnumerableT zu schreiben?

7

Ich habe eine Klasse wie:

%Vor%

Ist es möglich, ein rekursives IEnumerable für die SplineCollection zu schreiben, in dem alle untergeordneten Elemente nacheinander zurückgegeben werden?

EDIT: Also Master ist die Wurzel Box, und die Hierarchie seiner Kinder kann jede Tiefe sein.

EDIT: Durch die Verwendung des Namens Box glaube ich einige Leute verwirrt zu haben. Es soll ein geometrisches Objekt sein, kein Container. Also ändere es auf Spline.

    
Joan Venge 02.09.2010, 21:07
quelle

6 Antworten

9

Dies wird eine Tiefe-zuerst-Traversierung des Box 'Baums' machen. Sie können diese Methode dann einfach in der Box Master aufrufen, um alle rekursiven untergeordneten Elemente zurückzugeben.

%Vor%     
thecoop 02.09.2010, 21:21
quelle
10

Ich würde mit der manuellen Verwaltung eines Stapels gehen, anstatt mich hier auf den Aufruf-Stack zu verlassen. Der Grund dafür ist, dass für jedes IEnumerable<Spline> besucht ein neues Spline erstellt werden müsste, wenn Sie den Aufruf-Stack verwenden, indem Sie rekursiv die Methode aufrufen, die die Nachkommen abruft. Das wäre ineffizient. Sie können das Traversal erheblich verbessern, indem Sie Ihren eigenen Stack verwenden.

%Vor%     
Brian Gideon 14.09.2010 13:57
quelle
3

Ja - in diesem Abschnitt finden Sie rekursive Iterationen mithilfe von C # -Iteratoren.

>     
Steve Michelotti 02.09.2010 21:09
quelle
1
%Vor%

Sie können dies von BoxCollection aufrufen, aber da Box bereits eine Sammlung von Boxen ist, sehe ich nicht, wofür BoxCollection gedacht ist. In diesem Fall würde die Verwendung von Box implement IEnumerable<Box> oder eines seiner Nachkommen ( ICollection<Box> , IList<Box> ) wahrscheinlich die Nützlichkeit verbessern.

Es ist auch möglich, es eher iterativ als rekursiv zu machen, was manchmal eine bessere Leistung hat (so ziemlich zu jeder Zeit, wenn der Compiler die Rekursion nicht in eine Interaktion umsetzt), aber rekursiv ist besser lesbar und normalerweise mehr als performant genug.

    
Jon Hanna 02.09.2010 21:38
quelle
1

Ja, aber Sie müssen das rekursive Ergebnis aufzählen. Sie können es nicht einfach zurückgeben, weil der Typ nicht übereinstimmt.

%Vor%     
Craig Gidney 02.09.2010 21:49
quelle
-1

Sicher. Sie brauchen nicht wirklich einen BoxContainer, da Box nach ihrem Namen als Container existiert:

%Vor%

Wenn Box A die Boxen B und C enthält, Box B die Boxen D und E, und Box C die Box F, so würde die Aufzählung A, B, D, E, C, F erscheinen.

    
KeithS 02.09.2010 21:44
quelle