2014-01-25 4 views
1

질문 this에 루프에 의해 꼬리 재귀 호출을 대체하려고 :부모 발견 재귀 함수가

public static T FindParent<T>(DependencyObject child) where T : DependencyObject 
{ 
    DependencyObject parentObject = VisualTreeHelper.GetParent(child); 
    if (parentObject == null) return null; 
    var parent = parentObject as T; 
    if (parent != null) 
    { 
     return parent; 
    } 
    return FindParent<T>(parentObject); 
} 

ReSharper에서 대신 재귀 루프로 변환 나 제공을이처럼 수행 이 : 이제

public static T FindParent<T>(DependencyObject child) where T : DependencyObject 
{ 
    while (true) 
    { 
     DependencyObject parentObject = VisualTreeHelper.GetParent(child); 
     if (parentObject == null) return null; 
     var parent = parentObject as T; 
     if (parent != null) 
     { 
      return parent; 
     } 
     child = parentObject; 
    } 
} 

I가 확장 된 그룹 및 모든 하위 그룹 붕괴 기능 :

,691을

불행하게도 Reshaper가 난 그냥 while 문을 사용하여 같은 방식으로 변환하는 방법을 알아낼 수 없습니다 :(

private void MenuItemCollapseAll_OnClick(object sender, RoutedEventArgs e) 
{ 
    // ... truncated for brievety 
    IEnumerable<CollectionViewGroup> groups = grid.Items.Groups.OfType<CollectionViewGroup>().ToArray(); 
    CollapseGroups(grid, groups); 
} 

public void CollapseGroups(DataGridControl grid, IEnumerable<CollectionViewGroup> groups) 
{ 
    foreach (var @group in groups) 
    { 
     grid.CollapseGroup(group); 
     var subGroups = @group.Items.OfType<CollectionViewGroup>().ToArray(); 
     if (subGroups.Any()) 
     { 
      CollapseGroups(grid, subGroups); 
     } 
    } 
} 

위처럼 변환하는 나에게 제공하지 않습니다, 완전히 확실하지 않은 것이 가능 여부 바로이 기능 때문입니다.

아이디어가 있으십니까?

+1

경우 (subGroups.Any()) {CollapseGroups (그리드, 하위 그룹)'에 대한 필요 없음을; }'- CollapseGroups를 호출하면됩니다. subGroups 배열이 비어 있으면 메서드가 즉시 종료됩니다. 불필요하게 메소드를 호출하지 않으려 고하는 효율성에 관심이 있다면'Any' 확장 메소드를 사용하는 대신'if (subGroups.Length == 0) '를 사용해야합니다. – phoog

+0

알았어, 고마워! – Aybe

답변

3

꼬리 재귀가 아닙니다. 재귀 호출 후 foreach 루프를 반복합니다. 그러나 모든 희망이 사라지는 것은 아닙니다.

반복으로 변환하려면 Stack<Tuple<DataGridControl, IEnumerable<CollectionViewGroup>>을 만들고 스택에 새 튜플을 넣고 재귀 호출을 바꾸십시오. 그런 다음 스택이 모두 소모 될 때까지 반복하십시오.

하지만 먼저 매개 변수가 변경되지 않습니다. 그래서 반복 버전은 실제로 스택에 그것을 유지하기 위해 필요하지 않습니다

public void CollapseGroups(DataGridControl grid, IEnumerable<CollectionViewGroup> groups) 
{ 
    var to_process = new Stack<IEnumerable<CollectionViewGroup>>(); 
    to_process.Push(groups); 
    do { 
     groups = to_process.Pop(); 
     foreach (var @group in groups) 
     { 
      grid.CollapseGroup(@group); 
      to_process.Push(@group.Items.OfType<CollectionViewGroup>()); 
     } 
    } while (to_process.Count > 0); 
} 
+0

환상적입니다. 고마워요! :)))) – Aybe

관련 문제