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结构?

解决方案 »

  1.   

    http://www.csharpwin.com/csharpspace/4584r1911.shtml
    这是数据库的递归,道理完全一样
      

  2.   

    解决,谢谢楼上    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);
                    }
                }
            }
         }
      

  3.   


     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);
                    }
                }
            }