2012-04-03 2 views
0

Ich habe eine Klasse, die möglicherweise ein Elternteil oder eine Liste von Kindern desselben Typs besitzt. Das folgende Code-Snippet sollte mein Szenario erläutern.Iteration eines Objekts, das Eltern oder Kind desselben Typs haben kann

public abstract class X{ 
    public virtual List<X> ChildItems { get; set; } 
    public virtual X ParentItem { get; set; } 
} 

Ich mag würde wissen, ob es eine besonders effiziente Methode ist, die Objekte von einem Objekt vom Typ X zu durchqueren, zu überprüfen, ob das Objekt einen Elternteil hat, oder Start-Kinder von unten nach oben.

public static void SaveSetup(X obj) { 
    //logic here 
} 

Jede Hilfe wird geschätzt.

+1

Nicht sicher, was Sie erreichen möchten? Versuchen Sie, das Top-Level-Objekt oder etwas zu identifizieren? –

+1

Sehen Sie [TPL für das Überqueren des Baums von Blättern/Zweigen zur Wurzel] (http://social.msdn.microsoft.com/Forums/da-DK/parallelextensions/thread/91b0e5a9-6cdd-4e5b-81fc-51c34defd046) – sll

+0

Deine Frage ist nicht klar. – Sandeep

Antwort

1

Was Sie beschäftigen, ist eine Baumstruktur (oder möglicherweise viele getrennte Baumstrukturen). Eine Baumstruktur hat ein Wurzelelement. Normalerweise wird eine Baumstruktur ausgehend von der Wurzel durchlaufen. Wenn Sie von einem beliebigen Element im Baum aus beginnen möchten, empfehle ich Ihnen, zuerst das Wurzelelement zu erhalten und dann auf die übliche Weise zu traversieren.

public abstract class X 
{ 
    public virtual List<X> ChildItems { get; set; } 
    public virtual X ParentItem { get; set; } 

    // Method for traversing from top to bottom 
    public void Traverse(Action<X> action) 
    { 
     action(this); 
     foreach (X item in ChildItems) { 
      item.Traverse(action); 
     } 
    } 

    // Get the root (the top) of the tree starting at any item. 
    public X GetRootItem() 
    { 
     X root = this; 
     while (root.ParentItem != null) { 
      root = root.ParentItem; 
     } 
     return root; 
    } 
} 

Jetzt können Sie das Setup speichern mit

X root = item.GetRootItem(); 
root.Traverse(SaveSetup); 

Beispiel mit Lambda-Ausdruck. Gibt alle Elemente des Baums aus, vorausgesetzt, dass ToString() überschrieben wurde, um eine sinnvolle Zeichenfolge zurückzugeben.

root.Traverse(x => Console.WriteLine(x)); 
+0

Dies ist genau die Richtung, die ich suchte. Nachdem ich den Code ein wenig geändert hatte, um meinem ursprünglichen Szenario zu entsprechen, funktionierte es effizient und korrekt. Danke vielmals. – Mez

0

Traverse aus gegebenen Objekt zu root (ParentItem = null)

public static void SaveSetup(X obj) { 
    while (obj != null) 
    { 
     // logic here 
     obj = obj.ParentItem; 
    } 
} 
+0

dann vermisst du es Geschwister (und Onkel und Cousins ​​und Neffen) –

+0

Die Frage ist nicht klar genug, vielleicht braucht er nur das :) – asktomsk

+0

Sorry, wenn die Frage nicht klar genug war. Lassen Sie mich in einem Szenario erklären. Zum Beispiel möchte ich eine Baumhierarchie einer Filiale kleiner Märkte einrichten. Jeder Markt kann einen Elternmarkt und auch mehrere Kindermärkte haben. Also, wenn ich einen Markt laden möchte, kann ich beide Dinge sehen, die sind: 1) Wem er/sie gehört 2) Welche anderen Märkte fallen unter diesem bestimmten Markt So Objekt X, wäre Markt. Aber ein Markt kann viele Mini-Märkte besitzen und einen Elternteil haben, unter den er fällt. Hoffe, das löscht einige Dinge :-) – Mez