首页 新闻 搜索 专区 学院

可否帮我优化下 这段 递归代码

0
悬赏园豆:120 [已解决问题] 解决于 2016-09-20 18:34

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 递归测试
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
list = DataAccess.SelectAll();
CreateNode(list[0]);
}
List<Type> list;
TreeNode parentNode;
private void CreateNode(Type type)
{
if (list.Count > 0) list.RemoveAt(0);
else return;

TreeNode node = new TreeNode();
node.Text = type.TypeName;
node.Tag = type.TypeID;

if (type.ParentID == 0)
{// 根节点
this.treeView1.Nodes.Add(node);
}
else
{// 遍历 树控件 找到子节点
CheckForNode(type.ParentID);
parentNode.Nodes.Add(node);
}
if (list.Count > 0) CreateNode(list[0]);
}

// 遍历树控件 找到节点的tag为parentid的节点
void CheckForNode(int parentid)
{
if (this.treeView1.Nodes.Count == 0) return ;
FindNode(this.treeView1.Nodes[0], parentid);
//return node;
}


// 为当前新产生的节点找到它的父节点 赋值给全局变量parentNode
// 这里没有使用返回父节点的原因 如若返回递归并不会正确执行
void FindNode(TreeNode node, int parentid)
{
if (Convert.ToInt32(node.Tag) == parentid)
{
parentNode = node;
}
foreach (TreeNode item in node.Nodes)
{
FindNode(item, parentid);
}
}

}
}

有什么不能一笑而过呢的主页 有什么不能一笑而过呢 | 初学一级 | 园豆:4
提问于:2016-09-19 19:25
< >
分享
最佳答案
1

分好多,大概看了下,实现的是从数据库读取记录,按照父级ID加载到树形控件中。

我给你优化了一下,思路是先创建树形结构,然后按照树形结构递归加载到控件中,性能应该还行,没有刻意优化。

效果:

代码:

private void button1_Click(object sender, EventArgs e)
        {
            treeView1.Nodes.Clear();
            var list = new List<WinFormTest.MyType>();//DataAccess.SelectAll();
            //生成测试用数据 0为根节点 若没有自己建一个
            for (int i = 0; i <= 50; i++)
            {
                list.Add(new MyType { ParentID = new Random().Next(i), TypeID = i, TypeName = i + "" + i });
            }
            //设置子节点
            foreach (var myType in list)
            {
                var parent = list.FirstOrDefault(b => b.TypeID == myType.ParentID);
                if (myType.TypeID != 0 && parent != null)
                {
                    parent.Childs.Add(myType);
                }
            }
            //加载到控件中
            var root = list.FirstOrDefault(b => b.TypeID == 0);
            root.Childs.ForEach(b => CreateNode(b, treeView1.Nodes));
            treeView1.ExpandAll();
        }
        //递归加载
        void CreateNode(MyType myType, TreeNodeCollection node)
        {
            var treeNode = new TreeNode() { Text = myType.TypeName, Tag = myType.TypeID };
            node.Add(treeNode);
            if (myType.Childs.Count > 0)
            {
                myType.Childs.ForEach(b => CreateNode(b, treeNode.Nodes));
            }
        }

另外,你的数据结构里面增加一个子节点

    public class MyType
    {
        public int TypeID { get; set; }
        public string TypeName { get; set; }
        public int ParentID { get; set; }

        public List<MyType> Childs = new List<MyType> { };
    }

 

收获园豆:120
浴子风 | 小虾三级 |园豆:523 | 2016-09-20 16:33

等我回去 试一下啊 莫急

有什么不能一笑而过呢 | 园豆:4 (初学一级) | 2016-09-20 16:38

var parent = list.FirstOrDefault(b => b.TypeID == myType.ParentID);

请问下 这句 linq  为啥要这句

有什么不能一笑而过呢 | 园豆:4 (初学一级) | 2016-09-20 17:44

@空野指针: 哦哦哦,满足这个条件的 第一个 。。。。看蒙了

有什么不能一笑而过呢 | 园豆:4 (初学一级) | 2016-09-20 17:47

@空野指针: 嗯,明白就行。就是找到他的父级点,建立树形关系。

浴子风 | 园豆:523 (小虾三级) | 2016-09-21 09:23
其他回答(3)
0

不能用插入代码的形式么?

顾晓北 | 园豆:10241 (专家六级) | 2016-09-20 09:16
0

我觉得写的可以了,最好FindNode方法返回你找到的TreeNode,那么foreach那个你就好break出去了。

Daniel Cai | 园豆:10374 (专家六级) | 2016-09-20 09:22
0

用栈来实现,抛弃递归。

空明流光 | 园豆:62 (初学一级) | 2016-09-20 11:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册