2016-06-06 12 views
0

Ich habe eine Baumvariable. Die erste Ebene1 hat eine Liste von Level2-Elementen. Jedes von Level2 hat eine Liste von Level3-Elementen. bis level4.mehrere Enumeratoren auf einem Baum

Ich nedd, um durch level4 (alle level4, wie wenn level1 eine Liste hat) zu iterieren, also erstelle ich einen Enumerator in level1. Es läuft gut. Aber jetzt muss ich Level2 und Level3 auch iterieren. Ich versuche, 2 weitere Aufzählungen in ebenen1 Klasse zu erstellen, aber ich erhalte eine Fehlermeldung in der generischen Funktion

IEnumerator IEnumerable.GetEnumerator() 

Ich versuche 3 IEnumerable für ebenen1 Klasse. Aber ich lese viele Themen, die sagen, dass es keine gute Arbeit ist. Diese sagen, um Zusammensetzung zu verwenden. Aber (wenn ich gut verstehe), ich habe nicht 2 Listen in Level1 Klasse, aber Kinderlisten in Kinderlisten in ...

Der Baum kann oft ändern (ein level3 kann von einem level2 zum anderen wechseln. Benutzer kann Elemente auf jeder Ebene hinzufügen/entfernen. Ich kann also nicht alle Level-Elemente in Level1-Klasse speichern.

Die Frage ist: Was ist der beste Weg, etwas wie das

foreach(level2 lvl2 in level1) 
{} 
foreach(level3 lvl3 in level1) 
{} 
foreach(level4 lvl4 in level1) 
{} 

bearbeiten zu tun:

der Baum:

level1 
    |-> level2 node 
    |-> level3 node 
      |-> level4 node 
      |-> level4 node 
      |-> level4 node 
      |-> ... 
    |-> level3 node 
      |-> level4 node 
      |-> level4 node 
      |-> level4 node 
      |-> ... 
    |-> level3 node 
      |-> level4 node 
      |-> level4 node 
      |-> level4 node 
      |-> ... 
    |-> ... 
    |-> level2 node 
    |-> level3 node 
      |-> level4 node 
      |-> level4 node 
      |-> level4 node 
      |-> ... 
    |-> level3 node 
      |-> level4 node 
      |-> level4 node 
      |-> level4 node 
      |-> ... 
    |-> ... 
    |-> level2 node 
    |-> level3 node 
      |-> level4 node 
      |-> level4 node 
      |-> level4 node 
      |-> ... 
    |-> level3 node 
      |-> level4 node 
      |-> level4 node 
      |-> level4 node 
      |-> ... 
    |-> ... 
    |-> ... 

Mein Baum Klasse

public class TreeLevel1 : IEnumerable 
{ 
    public list<TreeLevel2> treeLevel2 = new list<TreeLevel2>(); 
    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return (IEnumerator)GetEnumerator(); 
    } 
    public TreeLevel4Enumerator GetEnumerator() 
    { 
     return new TreeLevel4Enumerator(); 
    } 
} 
public class TreeLevel2 
{ 
    public List<TreeLevel3> treeLevel3 = new List<TreeLevel3>(); 
} 
public class TreeLevel3 
{ 
    public List<TreeLevel4> treeLevel4 = new List<TreeLevel4>(); 
} 
public class TreeLevel4 
{ 
    //some stuff 
} 

Der Enumerator cl ass ein BFS und nur level4 zurückgeben. So kann ich tun:

TreeLevel1 lvl1 = new TreeLevel1(); 
//populate lvl1.treeLevel2 - with lots of TreeLevel2 
//populate lvl1.treeLevel2.treeLevel3 - for each treeLevel2 
//populate lvl1.treeLevel2.treeLevel3.treeLevel4 - foreach treeLevel3 
foreach(Level4 lvl4 in lvl1) 
{ 
    //do stuff 
} 

Jetzt muss ich durch lvl1.treeLevel2 und lvl1.treeLevel2.treeLevel3 iterieren. So erzeuge ich 2 Aufzählungen in TreeLevel1 Klasse von

public TreeLevel2Enumerator GetEnumerator() 
{ 
    return new TreeLevel2Enumerator(); 
} 
public TreeLevel3Enumerator GetEnumerator() 
{ 
    return new TreeLevel3Enumerator(); 
} 

Zugabe Und dann

foreach(Level2 lvl2 in lvl1) 
{ 
    //do stuff 
} 
foreach(Level3 lvl3 in lvl1) 
{ 
    //do stuff 
} 
foreach(Level4 lvl4 in lvl1) 
{ 
    //do stuff 
} 

benutzen, aber ich erhalte eine Fehlermeldung in dem generischen Enumerator in TreeLevel1 Klasse

IEnumerator IEnumerable.GetEnumerator() 
{ 
    return (IEnumerator)GetEnumerator(); //error here 
} 

Ich verstehe, dass die Das Programm kann nicht auswählen, welcher Enumerator verwendet werden soll. Und so ist meine Frage: Wie kann ich enumeratorartige Funktionen erstellen, um durch jede Ebene zu iterieren (mit einer foreach wäre toll, aber jede andere Möglichkeit ist ok)

+1

Lookup 'Breiten ersten search' – muratgu

+0

Vielleicht [diese] (http://ideone.com/ozdyB0) wird helfen. Lass mich wissen ob es funktioniert. –

+0

Vielen Dank für Ihre Antwort, aber ich denke, ich erkläre nicht, was ich wirklich will. Tatsächlich verwende ich bereits ein BFS, um Level 4 mit einem Enumerator zu durchlaufen. Was ich brauche, ist 2 andere Enumeratoren für level2 und level3. Ich bearbeite meine Fragen zu entwickeln – bubarnet

Antwort

0

Ok, ich fand eine sehr einfache Möglichkeit, das zu tun: Ausbeute !

Ich erstelle 3 Methoden

public class TreeLevel1 
{ 
    public IEnumerable<TreeLevel2> TreeLevel2Enumerator() 
    { 
     for (int i = 0; i < treeLevel2List.Count; i++) 
     { 
      yield return treeLevel2List[i]; 
     } 
     yield break; 
    } 
    public IEnumerable<TreeLevel3> TreeLevel3Enumerator() 
    { 
     for (int i = 0; i < treeLevel2List.Count; i++) 
     { 
      TreeLevel2 lvl2=treeLevel2List[i]; 
      for(int j =0; j<lvl2.treeLevel3List.Count; j++) 
      { 
       yield return lvl2.treeLevel3List[j]; 
      } 
     } 
     yield break; 
    } 
} 

Und jetzt kann ich tun, dass

TreeLevel1 lvl1 = new TreeLevel1(); 
//populate lists 
foreach(TreeLevel2 lvl2 in lvl1.TreeLevel2Enumerator()) 
{ 
    //do stuff 
} 
foreach(TreeLevel3 lvl3 in lvl1.TreeLevel3Enumerator()) 
{ 
    //do stuff 
}