2013-08-20 11 views
3

중첩 된 트리 구조의 깊이를 찾을 수있는 속성을 만들고 싶습니다. 아래 정적은 재귀에 의해 깊이/레벨을 찾습니다. 하지만이 함수를 정적 메서드 대신 동일한 클래스의 속성으로 만들 수 있습니까?중첩 된 컬렉션의 최대 깊이/레벨 찾기

public static int GetDepth(MenuGroup contextMenuItems) 
{ 
    if (contextMenuItems == null || contextMenuItems.Items.Count == 0) 
     return 0; 

    var subMenu = contextMenuItems.Items.Select(b => b as MenuGroup); 
    if (!subMenu.Any()) 
     return 1; 

    var subLevel = subMenu.Cast<MenuGroup>().Select(GetDepth); 
    return !subLevel.Any() ? 1 : subLevel.Max() + 1; 
} 

코드에 일부 추가 정보를 원하시면 : 및 의 MenuItem은 메뉴 그룹에 아이가있는

의 MenuItem 자식 요소로 ObservableCollection<MenuBase> Items와 노드 MenuBase에서 파생 된 메뉴 그룹 자식이없는 떠나 노드입니다.

+1

: 'public int Depth {get {get GetDepth (something);} private set;}'뭔가 그 MenuGroup입니다. 메소드를 비공개 및 비 정적으로 만들고이 메소드에서 'this'를 사용할 수 있습니다. – wudzik

답변

3

그럼 당신은 쉽게 예, 인스턴스 속성으로 바꿀 수 :

하지만 쉽게 해결 될 수없는 매우 일 아직 인해 비 MenuGroup 항목의 취급,합니다
public int Depth 
{ 
    get 
    { 
     if (Items.Count == 0) 
      return 0; 
     var subMenu = Items.Select(b => b as MenuGroup); 
     if (!subMenu.Any()) 
      return 1; 
     var subLevel = subMenu.Cast<MenuGroup>().Select(x = > x.Depth); 
     return !subLevel.Any() ? 1 : subLevel.Max() + 1; 
    } 
} 

, 대신 SelectOfType 다음 Cast를 사용 :이 같은 속성을 만들 수 있습니다

public int Depth 
{ 
    get 
    { 
     // Completely empty menu (not even any straight items). 0 depth. 
     if (Items.Count == 0) 
     { 
      return 0; 
     } 
     // We've either got items (which would give us a depth of 1) or 
     // items and groups, so find the maximum depth of any subgroups, 
     // and add 1. 
     return Items.OfType<MenuGroup>() 
        .Select(x => x.Depth) 
        .DefaultIfEmpty() // 0 if we have no subgroups 
        .Max() + 1; 
    } 
} 
+1

@defaultlocale : 실제로는별로 필요하지 않았습니다. 계속 진행되고있는 일을 해결하는 데는 시간이 걸렸지 만 지금은 생각한 것 같습니다. 'OfType'은 확실히 깨끗합니다. 동의합니다 - 편집 된 답변을보십시오. –

0
public string GenerateMenu() 
{ 
    StringBuilder sb = new StringBuilder(); 
    sb.Append("<nav id=\"nvMenu\" class=\"main-nav\"><ul>"); 
    sb.Append(PrepareMenuUL(AppConfig._AppConfigInstance.Navigation.FirstOrDefault().NavigationClass)); 
    sb.Append("</ul></nav>"); 
    return sb.ToString(); 
} 

private string PrepareMenuUL(List<Navigation> navigation) 
{ 
    StringBuilder sb = new StringBuilder(); 

    if (Liflag == 1) 
    { 
     sb.Append("</li>"); 
     Liflag = 0; 
    } 

    foreach (var item in navigation) 
    { 
     var subMenu = item.NavigationClass.Select(b => b as Navigation); 

     if (subMenu.Any()) 
     { 
      sb.Append("<li class=\"dropdown\">"); 
      if (subMenu.Any() && item.Url == "#") 
       sb.Append(string.Format("<a href=\"{0}\">{1}<i class=\"icon-arrow\"></i></a>", BaseUrl + item.Url, item.Name)); 
      else if (subMenu.Any() && item.Url != "#" && item.Url != null) 
       sb.Append(string.Format("<a href=\"{0}\">{1}<i class=\"icon-rightarrow\"></i></a>", BaseUrl + item.Url, item.Name)); 
     } 
     else 
     { 
      sb.Append("<li>"); 
      sb.Append(string.Format("<a href=\"{0}\">{1}</a>", BaseUrl + item.Url, item.Name)); 
     } 

     if (subMenu.Any()) 
      sb.Append("<ul class=\"wd190\">"); 

     if (item.NavigationClass.Count > 0) 
     { 
      Liflag = 1; 
      sb.Append(PrepareMenuUL(item.NavigationClass)); 
     } 

     sb.Append("</li>"); 

     if (subMenu.Any()) 
      sb.Append("</ul>"); 
    } 

    return sb.ToString(); 
} 
+0

사용자 재귀를 사용하여 목록의 깊이를 찾을 수 있습니다. 위의 방법으로 보여 주었다. – Preetika

관련 문제