2012-08-29 66 views
1

我有樹視圖加載自定義類集合(例如:MyClass)。我想從檢查的樹視圖項返回MyClass []的集合,並且想要使用LINQ。我嘗試下面,它工作正常。但是我想寫1行Linq查詢,甚至沒有使用列表<>。任何幫助?是否有可能在1 Linq查詢中有遞歸?LINQ查詢遍歷樹視圖並獲取數據

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級的深度。每個父節點都有一組子節點,只有一個級別。

回答

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

丹尼爾 - 謝謝。我在尋找這樣的東西。但是你可以檢查第一部分語法。除了新的[] {節點}外,一切看起來都很好。這是否有隱含的類型轉換在這裏?它會導致錯誤的編譯時間。再次感謝您的及時回覆。 –

+0

@emmanuuelpascal:你得到了什麼編譯錯誤?這應該工作。 –

+0

@emmanuuelpascal我編輯以避免編譯錯誤。但請檢查它是否仍然正常。 –