2010-08-05 3 views
0

재귀를 사용하여 다음 HTML 순서없는 목록을 출력 할 수 있습니까? 원래의 데이터가 페이지가 여기에C# 재귀를 사용하여 목록에서 HTML 순서없는 목록 만들기

public class Page 
    { 
     public int Id { get; set; } 
     public int pageId { get; set; } 
     public int parentPageId { get; set; } 
    } 

인 다음 목록

 List<Page> pages = new List<Page>(); 

     pages.Add(new Page { Id = 1, pageId = 1, parentPageId = 0 }); 
     pages.Add(new Page { Id = 2, pageId = 2, parentPageId = 0 }); 
     pages.Add(new Page { Id = 3, pageId = 3, parentPageId = 0 }); 
     pages.Add(new Page { Id = 4, pageId = 4, parentPageId = 0 }); 
     pages.Add(new Page { Id = 5, pageId = 5, parentPageId = 1 }); 
     pages.Add(new Page { Id = 6, pageId = 6, parentPageId = 1 }); 
     pages.Add(new Page { Id = 7, pageId = 7, parentPageId = 0 }); 
     pages.Add(new Page { Id = 8, pageId = 8, parentPageId = 5 }); 
     pages.Add(new Page { Id = 9, pageId = 9, parentPageId = 5 }); 

에서 개최되는

<ul> 
    <li>1 
     <ul> 
      <li>5 
       <ul> 
        <li>8</li> 
        <li>9</li> 
       </ul> 
      </li> 
      <li>6</li> 
     </ul> 
    </li> 
    <li>2</li> 
    <li>3</li> 
    <li>4</li> 
    <li>7</li> 
</ul> 

는 지금까지 물론 완벽하게 작동하지 않는 무슨이다. ..

 foreach (var page in pages) 
     { 
      Console.WriteLine("<ul><li>{0}", page.pageId); 
      WriteMenu(pages, page.pageId, page.parentPageId); 
     } 


    public static void WriteMenu(List<Page> pages, int pageId, int parentPageId) 
    { 
     foreach (var page in pages) 
     { 
      if (page.parentPageId == pageId) 
      { 
       Console.WriteLine("<ul><li>{0}", page.pageId); 
       WriteMenu(pages, page.pageId, page.parentPageId); 
      } 
     } 
    } 

답변

3

H 흐름에 대한 :

public static bool WriteMenu(List<Page> pages, int parentId, int indent) 
{ 
    string padding = new string(' ', indent * 8); 
    bool writtenAny = false; 
    foreach (var page in pages.Where(p => p.ParentPageId == parentId)) 
    { 
     if (!writtenAny) 
     {     
      Console.WriteLine(); 
      Console.WriteLine(padding + "<ul>"); 
      writtenAny = true; 
     } 
     Console.Write(padding + " <li>{0}", page.PageId); 
     if (WriteMenu(pages, page.PageId, indent + 1)) 
     { 
      Console.WriteLine(padding + " </li>");     
     } 
     else 
     { 
      Console.WriteLine("</li>"); 
     } 
    }   
    if (writtenAny) 
    { 
     Console.WriteLine(padding + "</ul>"); 
    } 
    return writtenAny; 
}  
... 
WriteMenu(pages, 0, 0); 
+0

거의가 그 ... -2,3,4,7- 부분 내 예와 같지 않다. –

+0

@Nicholas : 좋아요, 편집했습니다 - 당신의 예제가 어떤 이유로 든 6 번 항목을 제외하고는 * 정확하게 * 보이는 것처럼 보입니다.) –

+0

우수, 고맙습니다. Hexakosioihexekontahexaphobia 한판 승부가있었습니다 ... 죄송합니다! –

1

죄송합니다, 내 첫 번째 자상에 재귀 비트를 놓친이 원하는 결과를 얻을해야합니다

 Console.WriteLine("<ul>"); 
     foreach (var page in pages) 
     { 
      if (page.parentPageId == 0) 
      { 
       WriteMenu(pages, page); 
      } 
     } 
     Console.WriteLine("</ul>"); 



    private static void WriteMenu(List<Page> pages, Page page) 
    { 
     Console.WriteLine("<li>" + page.pageId); 

     var subpages = pages.Where(p => p.parentPageId == page.pageId); 

     if (subpages.Count() > 0) 
     { 
      Console.WriteLine("<ul>"); 
      foreach (Page p in subpages) 
      { 
       if (pages.Count(x => x.parentPageId == p.pageId) > 0) 
        WriteMenu(pages, p); 
       else 
        Console.WriteLine(string.Format("<li>{0}</li>", p.pageId)); 
      } 
      Console.WriteLine("</ul>"); 
     } 

     Console.WriteLine("</li>"); 
    } 
+0

@ 니콜라스 환영합니다. 다행스럽게도 : D – heisenberg