2016-06-06 5 views
0

트리 변수가 있습니다. 첫 번째 레벨 1에는 level2 요소 목록이 있습니다. 각 level2에는 level3 요소 목록이 있습니다. 레벨 4까지.트리의 다중 열거 자

레벨 4 (레벨 1에 목록이있는 것처럼 모든 레벨 4)를 반복하기 때문에 level1에 열거자를 만듭니다. 잘 작동한다. 하지만 이제 레벨 2와 레벨 3도 반복해야합니다. 나는 수준 1 클래스의 2 개 이상 열거를 만들려고하지만 나는 일반적인 기능 나는 수준 1 클래스 3를 IEnumerable을 사용하려고

IEnumerator IEnumerable.GetEnumerator() 

에 오류가 발생합니다. 하지만 좋은 일이 아니라고 말하는 많은 주제를 읽었습니다. 이들은 구성을 사용한다고 말합니다. 그러나 (잘 이해한다면) 레벨 1 클래스에는 2 개의 목록이 없지만 하위 목록에는 2 개의 목록이 없습니다 ...

트리가 자주 변경 될 수 있습니다 (레벨 3는 레벨 2에서 다른 레벨로 변경 될 수 있습니다.) 사용자 모든 레벨에서 요소를 추가/제거 할 수 있습니다. 따라서 각 레벨 요소를 level1 클래스에 쉽게 저장할 수 없습니다.

질문 :

트리 :

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 
      |-> ... 
    |-> ... 
    |-> ... 

내 나무 클래스

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 
} 

가장 좋은 방법은 그

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

편집 같은 것을 수행 할 작업 열거 자 cl 엉덩이는 BFS를하고 레벨 4 만 반환합니다. 그래서 내가 할 수있는 :

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 
} 

가 지금은 lvl1.treeLevel2 및 lvl1.treeLevel2.treeLevel3을 반복해야합니다. 그래서

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

을 사용하여 다음

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

그리고 추가하여 TreeLevel1 클래스 2 개 열거를 생성하지만 내가 이해

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

TreeLevel1 클래스의 일반 열거에 오류가 프로그램은 사용할 열거자를 선택할 수 없습니다. 그리고 내 질문은 : 어떻게 각 레벨을 통해 반복하는 열거 자 같은 함수를 만들 수 있습니다 (foreach를 사용하여 위대한 것입니다,하지만 다른 가능성은 괜찮습니다)

+1

룩업'아마 너비 우선 search' – muratgu

+0

[이 (http://ideone.com/ozdyB0) 도움이 될 것입니다. 작동하는지 알려주세요. –

+0

답장을 보내 주셔서 감사합니다. 그러나 저는 제가 정말로 원하는 것을 설명하지 못한다고 생각합니다. 사실 열거자를 사용하여 레벨 4를 반복하는 데 이미 BFS를 사용합니다. 내가 필요한 것은 level2와 level3에 대한 2 개의 다른 열거 자입니다. 개발할 질문을 편집합니다. – bubarnet

답변

0

좋아, 나는 그렇게하는 아주 간단한 방법을 발견 : 수확량!

제가 3 개 방법

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; 
    } 
} 

를 생성하고, 지금 할 수

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