使用Linq

时间:2016-06-07 19:31:21

标签: c# linq dictionary treeview

我想过滤一个列表,这是一个字典的值并返回一个过滤的字典。例如,在此ListView中:

var filteredLvItems = ConfigManager.TemplateNamesAsLvItem
                .Where(x => x.Text.ToUpper()
                .StartsWith(searchParam))
                .ToArray();

ConfigManager是一个静态类,TemplateNamesAsLvItem是一个静态属性。 searchParam是TextBox的内容,用户可以在其中过滤值。 现在我有这个数据类型:

 Dictionary<TreeNode, TreeNodeCollection>

其中键是父节点,值是子节点。我试过这个来实现一个包含所有过滤的TreeNodeCollection节点的字典:

  var filteredTvCollection = ConfigManager.TemplateNamesAsNodes.Values
                .Cast<TreeNode>()
                .Where(y => y.Text.StartsWith(searchParam))
                .ToDictionary(t => t, t => t.Nodes);

            treeViewTemplates.Nodes.Clear();

            foreach (KeyValuePair<TreeNode, TreeNodeCollection> nodes in filteredTvCollection)
            {
                if (!treeViewTemplates.Nodes.Contains(nodes.Key))
                    treeViewTemplates.Nodes.Add(nodes.Key);

                var indexOfParentNode = GetParentNodeIndexByNodeName(nodes.Key.Text);

                if (nodes.Value.Count > 0)
                    treeViewTemplates.Nodes[indexOfParentNode].Nodes.AddRange(nodes.Value.Cast<TreeNode>().ToArray());

目的是过滤此列表,清除树视图并仅向用户显示“已过滤”的树视图。 我知道这段代码不起作用,但其他一切都会导致错误。这一次崩溃了。 这个问题可能吗?我试图避免foreach循环和不必要的代码。希望有人能帮助我! 谢谢!

编辑:

我也试过这个:

 foreach (KeyValuePair<TreeNode, TreeNodeCollection> nodes in ConfigManager.TemplateNamesAsNodes)
            {
                if (!treeViewTemplates.Nodes.Contains(nodes.Key))
                    treeViewTemplates.Nodes.Add(nodes.Key);

                var indexOfParentNode = GetParentNodeIndexByNodeName(nodes.Key.Text);

                if (nodes.Value != null)
                    treeViewTemplates.Nodes[indexOfParentNode].Nodes
                        .AddRange(nodes.Value.Cast<TreeNode>()
                        .Where(t => t.Text.Contains(searchParam)).ToArray());
            }

但那里没有任何事情发生。只是父节点被导入。

0 个答案:

没有答案