Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winforms 是否可以优化此代码?_Winforms_C# 4.0_Recursion_Linq To Objects_Lambda - Fatal编程技术网

Winforms 是否可以优化此代码?

Winforms 是否可以优化此代码?,winforms,c#-4.0,recursion,linq-to-objects,lambda,Winforms,C# 4.0,Recursion,Linq To Objects,Lambda,我必须在WinForm中显示一个基于复杂字典的树视图,我正在寻找“最短”的方法。我认为这可以在一个LINQ查询中完成,但我不知道如何完成,甚至不确定这是否可行 下面是条目词典的一个示例: Dictionary<String, String> dict = new Dictionary<String, String>() { {"aaa.bbb.ccc.ddd", "value1"}, {"aaa.bbb.ccc.eee", "value2"}, {"aaa.b

我必须在WinForm中显示一个基于复杂字典的树视图,我正在寻找“最短”的方法。我认为这可以在一个LINQ查询中完成,但我不知道如何完成,甚至不确定这是否可行

下面是条目词典的一个示例:

Dictionary<String, String> dict = new Dictionary<String, String>()
{
  {"aaa.bbb.ccc.ddd", "value1"},
  {"aaa.bbb.ccc.eee", "value2"},
  {"aaa.bbb.fff.ggg", "value3"},
  {"aaa.hhh.iii.jjj", "value4"},
  {"bbb.ddd", "value5"},
  {"ccc", "value6"}
};
这里是我现在得到的(我还没有处理这个值):

List List=newlist(){
“aaa.bbb.ccc.ddd”,
“aaa.bbb.ccc.eee”,
“aaa.bbb.fff.ddd”,
“aaa.bbb.fff.ggg”,
“aaa.ggg.fff.hhh”,
“hhh.iii.jjj.kkk”
};
动作遍历=空;
遍历=(节点、链)=>
{
String[]tab=chaine.Split(新字符[]{.'},2);
treenodechild=null;
if(node.Nodes.ContainsKey(选项卡[0]))
{
子节点=节点。节点[选项卡[0]];
}
其他的
{
child=node.Nodes.Add(tab[0]);//+((tab.Length>1)?“-”+tab[1]:”);
child.Name=tab[0];
}
如果(tab.Length>1&&!String.IsNullOrEmpty(tab[1]))
遍历(子项,选项卡[1]);
};
TreeNode测试=this.treeView1.Nodes.Add(“测试”);
ForEach(x=>遍历(test,x));

我希望我的解释足够清楚。

在您的操作中有相当多的逻辑,因此我怀疑它是否可以在单个LINQ查询中完成,以便看起来像这样

var query=从这个到那个
这是哪里
选择此

但你可以做的是重写一下,比如:

    public void AnotherWay()
    {
        TreeNode parent = this.treeView1.Nodes.Add("test");

        List<String> list = new List<String>() 
        { 
            "aaa.bbb.ccc.ddd", 
            "aaa.bbb.ccc.eee",
            "aaa.bbb.fff.ddd",
            "aaa.bbb.fff.ggg",
            "aaa.ggg.fff.hhh",
            "hhh.iii.jjj.kkk"
        };

        list.ForEach(x =>
            {
                TreeNode root = parent;
                TreeNode child = null;

                x.Split(new[] { '.' })
                    .ToList()
                    .ForEach(i =>
                    {
                        child = root.Nodes.ContainsKey(i) ?
                            root.Nodes[i] :
                            root.Nodes.Add(i);

                        child.Name = i;
                        root = child;
                    });
            });
    }

我将字典值处理作为练习留给您,但是
ForEach
中的其余逻辑与我的第一个示例中的相同。

它更适合这里:我下次会知道的,谢谢。谢谢,这非常有帮助,这有助于我理解一些遗漏的原则;-)为了处理这个值,我添加了LOC'child.Text=child.Text+“=”+x.value;'在内部lambda表达式之后。你觉得对吗?您认为以递归方式使用GroupBy是否可行?是的,要打印值,您应该设置
.Text
属性。但是,我建议使用
StringBuilder()
而不是将字符串与
+
连接起来。此外,考虑缓存分割字符串,并在内部代码< >代码上运行。这样做的好处是,您可以测试当前键是否是最后一个键,以便知道何时打印值,例如
split_x.ForEach(k=>/*do stuff*/child.Text=split_x.last().Equals(k)?/*StringBuilder stuff*/:k;)
List<String> list = new List<string>() { 
    "aaa.bbb.ccc.ddd", 
    "aaa.bbb.ccc.eee",
    "aaa.bbb.fff.ddd",
    "aaa.bbb.fff.ggg",
    "aaa.ggg.fff.hhh",
    "hhh.iii.jjj.kkk"
};

Action<TreeNode, String> traverse = null;

traverse = (node, chaine) =>
{
    String[] tab = chaine.Split(new char[] { '.' }, 2);

    TreeNode child = null;
    if (node.Nodes.ContainsKey(tab[0]))
    {
        child = node.Nodes[tab[0]];
    }
    else
    {
        child = node.Nodes.Add(tab[0]); // + ((tab.Length > 1) ? " - " + tab[1] : ""));
        child.Name = tab[0];
    }

    if (tab.Length > 1 && !String.IsNullOrEmpty(tab[1]))
        traverse(child, tab[1]);
};

TreeNode test = this.treeView1.Nodes.Add("test");

list.ForEach(x => traverse(test, x));
    public void AnotherWay()
    {
        TreeNode parent = this.treeView1.Nodes.Add("test");

        List<String> list = new List<String>() 
        { 
            "aaa.bbb.ccc.ddd", 
            "aaa.bbb.ccc.eee",
            "aaa.bbb.fff.ddd",
            "aaa.bbb.fff.ggg",
            "aaa.ggg.fff.hhh",
            "hhh.iii.jjj.kkk"
        };

        list.ForEach(x =>
            {
                TreeNode root = parent;
                TreeNode child = null;

                x.Split(new[] { '.' })
                    .ToList()
                    .ForEach(i =>
                    {
                        child = root.Nodes.ContainsKey(i) ?
                            root.Nodes[i] :
                            root.Nodes.Add(i);

                        child.Name = i;
                        root = child;
                    });
            });
    }
    public void DictFunc()
    {
        TreeNode parent = this.treeView1.Nodes.Add("test");

        Dictionary<String, String> dict = new Dictionary<String, String>()
        {
            { "aaa.bbb.ccc.ddd", "Value1" },
            { "aaa.bbb.ccc.eee", "Value2" },
            { "aaa.bbb.fff.ddd", "Value3" },
            { "aaa.bbb.fff.ggg", "Value4" },
            { "aaa.ggg.fff.hhh", "Value5" },
            { "hhh.iii.jjj.kkk", "Value6" }
        };

        dict.ToList().ForEach(x =>
        {
            // For brevity, same as logic in example above.
            // Plus the small amount (~three LOC) of additional logic
            // required to handle the values.
        });
    }