我让treeView加载了自定义类集合(例如:MyClass)。我想从已检查的树视图项返回MyClass []的集合,并希望使用LINQ。我尝试下面,它工作正常。但我想写一行Linq查询,甚至没有使用List<>。有帮助吗?是否可以在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();
注意:treeView具有1级深度。每个父节点都有一组子节点,只有1个级别。
答案 0 :(得分: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();