2012-08-29 3 views
1

treeView에 사용자 정의 클래스 모음 (예 : MyClass)이로드되어 있습니다. 선택된 트리보기 항목에서 MyClass []의 콜렉션을 반환하고 LINQ를 사용하고 싶습니다. 나는 아래에서 그것을 시험해 본다. 하지만 List <을 사용하지 않고도 1 행 Linq 쿼리를 작성하고 싶습니다. 어떤 도움이 필요합니까? 1 Linq 쿼리 내에서 재귀가 가능합니까?LINQ treeview를 탐색하고 데이터를 가져 오는 쿼리

List<MyClass> items = new List<MyClass>();    
items.AddRange(from node in tvData.Nodes.OfType<TreeNode>().Where((x) => x.Checked) 
       select node.Tag as MyClass); 

tvData.Nodes.OfType<TreeNode>() 
      .ForEach((x => items.AddRange(from item in x.Nodes.OfType<TreeNode>() 
                 .Where((y) => y.Checked) 
              select item.Tag as MyClass))); 

return items.ToArray(); 

참고 : 1 레벨 깊이의 treeView입니다. 모든 부모 노드에는 하위 노드 집합과 1 개의 수준 만 있습니다.

답변

6

이 시도 :

return tvData.Nodes 
      .OfType<TreeNode>() 
      .SelectMany(x => new[]{ x }.Concat(x.Nodes.OfType<TreeNode>())) 
      .Where(x => x.Checked) 
      .Select(x => x.Tag as MyClass) 
      .ToArray(); 

과 같을 수 이상의 수준에 대한 해결책 :

IEnumerable<TreeNode> GetNodeAndChildren(TreeNode node) 
{ 
    return new[]{ node }.Concat(node.Nodes 
            .OfType<TreeNode>() 
            .SelectMany(x => GetNodeAndChildren(x))); 
} 

return tvData.Nodes 
      .OfType<TreeNode>() 
      .SelectMany(x => GetNodeAndChildren(x)) 
      .Where(x => x.Checked) 
      .Select(x => x.Tag as MyClass) 
      .ToArray(); 
+0

다니엘 - 감사합니다. 나는 이런 것을 찾고있다. 하지만 첫 번째 구문을 확인할 수 있습니까? new [] {node}를 제외하고 모두 괜찮아 보입니다. 여기에 암시 형 타이 캐스팅이 있습니까? 컴파일 타임에 오류가 발생합니다. 신속한 답장을 보내 주셔서 다시 한번 감사드립니다. –

+0

@emmanuuelpascal : 어떤 컴파일 오류가 발생합니까? 이것은 효과가있다. –

+0

@emmanuuelpascal 컴파일 오류를 피하기 위해 편집했습니다. 그러나 여전히 괜찮은지 확인하십시오. –

관련 문제