当前位置:编程学习 > C#/ASP.NET >>

请教list列表根据父节点组合成树列表的问题


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication7
{
    public class NodeData
    {
        public int id { set; get; }  //标识
        public int ParentId { set; get; }//父节点标识
        public string NodeTitle { set; get; }//显示标题
        public int sort { set; get; }//节点排序
        public List<NodeData> NodeList { set; get; }//子列表
    }
    class Program
    {
        static void Main(string[] args)
        {
            List<NodeData> allnode = new List<NodeData>{
                new NodeData{id=1,ParentId=0,sort=1,NodeTitle="节点类型I"}, //根节点的父节点为0
                new NodeData{id=2,ParentId=1,sort=1,NodeTitle="节点A"},
                new NodeData{id=3,ParentId=1,sort=2,NodeTitle="节点B"},
                new NodeData{id=4,ParentId=1,sort=3,NodeTitle="节点C"},
                new NodeData{id=5,ParentId=2,sort=1,NodeTitle="节点A_1"},
                new NodeData{id=6,ParentId=2,sort=2,NodeTitle="节点A_2"},
                new NodeData{id=7,ParentId=5,sort=1,NodeTitle="节点A_1_1"},
                new NodeData{id=8,ParentId=5,sort=2,NodeTitle="节点A_1_2"},
                new NodeData{id=9,ParentId=7,sort=1,NodeTitle="节点A_1_2_1"},
                new NodeData{id=10,ParentId=4,sort=1,NodeTitle="节点C_1"},
                new NodeData{id=11,ParentId=4,sort=2,NodeTitle="节点C_2"},
                new NodeData{id=12,ParentId=11,sort=1,NodeTitle="节点C_2_1"},
                new NodeData{id=13,ParentId=3,sort=1,NodeTitle="节点B_1"},
                new NodeData{id=14,ParentId=0,sort=2,NodeTitle="节点类型II"},
                new NodeData{id=15,ParentId=0,sort=3,NodeTitle="节点类型III"},
                new NodeData{id=16,ParentId=15,sort=1,NodeTitle="节点a"},
                new NodeData{id=17,ParentId=15,sort=2,NodeTitle="节点b"},
                new NodeData{id=18,ParentId=17,sort=1,NodeTitle="节点b_1"},
            };
            //怎么转化为下面的形式?
            
            List<NodeData> treenode = new List<NodeData>{
                new NodeData{id=1,ParentId=1,sort=1,NodeTitle="节点类型I",NodeList=new List<NodeData>{
                    new NodeData{id=2,ParentId=1,sort=1,NodeTitle="节点A",NodeList=new List<NodeData>{
                        new NodeData{id=5,ParentId=2,sort=1,NodeTitle="节点A_1",NodeList=new List<NodeData>{
                            new NodeData{id=7,ParentId=5,sort=1,NodeTitle="节点A_1_1"},
                            new NodeData{id=8,ParentId=5,sort=2,NodeTitle="节点A_1_2",NodeList=new List<NodeData>{
                                new NodeData{id=9,ParentId=7,sort=1,NodeTitle="节点A_1_2_1"}
                            }},
                        }},
                        new NodeData{id=6,ParentId=2,sort=2,NodeTitle="节点A_2"}
                    }},
                    new NodeData{id=3,ParentId=1,sort=2,NodeTitle="节点B",NodeList=new List<NodeData>{
                        new NodeData{id=13,ParentId=3,sort=1,NodeTitle="节点B_1"}
                    }},
                    new NodeData{id=4,ParentId=1,sort=3,NodeTitle="节点C",NodeList=new List<NodeData>{
                        new NodeData{id=10,ParentId=4,sort=1,NodeTitle="节点C_1"},
                        new NodeData{id=11,ParentId=4,sort=2,NodeTitle="节点C_2",NodeList=new List<NodeData>{
                            new NodeData{id=12,ParentId=11,sort=1,NodeTitle="节点C_2_1"}
                        }}
                    }}
                }},
                new NodeData{id=14,ParentId=0,sort=2,NodeTitle="节点类型II"},
                new NodeData{id=14,ParentId=0,sort=2,NodeTitle="节点类型III",NodeList=new List<NodeData>{
                    new NodeData{id=16,ParentId=15,sort=1,NodeTitle="节点a"},
                    new NodeData{id=17,ParentId=15,sort=2,NodeTitle="节点b",NodeList=new List<NodeData>{
                        new NodeData{id=18,ParentId=17,sort=1,NodeTitle="节点b_1"}
                    }},
                }},
            };
        }
        //数据可能有多重层次,不一定是四层的
        //请教怎么递归或Linq能把第一个allnode变为第二个treenode结构?
    }
}



数据可能有多重层次,不一定是四层的。怎么递归或用Linq能把第一个allnode变为第二个treenode结构? 类 --------------------编程问答-------------------- http://www.csharpwin.com/csharpspace/4584r1911.shtml
这是数据库的递归,道理完全一样 --------------------编程问答-------------------- 解决,谢谢楼上

    class Program
    {
        public static List<NodeData> dd = new List<NodeData>();
        static void Main(string[] args)
        {
            //.......
            //.......
             tree(0, null, allnode);  
        }
            public static void tree(int pid, NodeData node, List<NodeData> list)
        {
            var foot = from n in list
                       where n.ParentId == pid
                       select n;
            foreach (var item in foot)
            {
                if (node == null)
                {
                    NodeData dddd = new NodeData { id = item.id, ParentId = pid, sort = item.sort, NodeTitle = item.NodeTitle };
                    dd.Add(dddd);
                    tree(item.id, dddd, list);
                }
                else
                {
                    NodeData dddd = new NodeData { id = item.id, ParentId = pid, sort = item.sort, NodeTitle = item.NodeTitle };
                    if (node.NodeList == null)
                    {
                        node.NodeList = new List<NodeData>();
                    }
                    node.NodeList.Add(dddd);
                    tree(item.id, dddd, list);
                }
            }
        }
     }

--------------------编程问答--------------------

 List<NodeData> ddddxxxx = new List<NodeData>();
            tree(0, null, allnode, ref ddddxxxx);

  public static void tree(int pid, NodeData node, List<NodeData> list,ref List<NodeData> dd)
        {
            var foot = from n in list
                       where n.ParentId == pid
                       select n;
            foreach (var item in foot)
            {
                if (node == null)
                {
                    NodeData dddd = new NodeData { id = item.id, ParentId = pid, sort = item.sort, NodeTitle = item.NodeTitle };
                    dd.Add(dddd);
                    tree(item.id, dddd, list,ref dd);
                }
                else
                {
                    NodeData dddd = new NodeData { id = item.id, ParentId = pid, sort = item.sort, NodeTitle = item.NodeTitle };
                    if (node.NodeList == null)
                    {
                        node.NodeList = new List<NodeData>();
                    }
                    node.NodeList.Add(dddd);
                    tree(item.id, dddd, list,ref dd);
                }
            }
        }
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,