1

treeViewにカスタムクラスコレクション(例:MyClass)をロードしました。チェックされたツリービューアイテムからMyClass[]のコレクションを返し、LINQを使用したい。私は以下を試してみて、それはうまくいきます。しかし、List<>を使用せずに1行のLinqクエリを記述したいと思います。何か助けはありますか?1 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レベルの深さを持つtreeView。すべての親ノードには、子ノードのセットと1つのレベルのみがあります。

4

1 に答える 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();
于 2012-08-29T07:30:26.737 に答える