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

请教一个list查询的问题


using System.Collections.Generic;
using System.Linq;
using System.Threading;

namespace ConsoleApplication2
{

    public class node
    {
        public int id { set; get; }
        public string name { set; get; }
        public int patentId { set; get; }
        public List<node> nodeList { set; get; }
        public List<node2> node2List { set; get; }
    }
    public class node2
    {
        public int id { set; get; }
        public int node_id { set; get; }//node_id是node的id
        public string name { set; get; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //数据格式:
            List<node> nodeList = new List<node>{
                new node{id=1,patentId=0,name="A"},
                new node{id=2,patentId=0,name="B"},
                new node{id=3,patentId=0,name="C"},
                new node{id=4,patentId=1,name="A-1"},
                new node{id=5,patentId=4,name="A-1-1"},
                new node{id=6,patentId=2,name="B-1"},
                new node{id=7,patentId=4,name="A-1-2"},
            };
            List<node2> node2List = new List<node2>{
                new node2{id=1,node_id=1,name="A的属性"},
                new node2{id=2,node_id=1,name="A的属性"},
                new node2{id=3,node_id=1,name="A的属性"},
                new node2{id=4,node_id=4,name="A-1的属性"},
                new node2{id=5,node_id=5,name="A-1-1的属性"},
                new node2{id=6,node_id=6,name="B-1的属性"},
                new node2{id=7,node_id=2,name="B的属性"},
                new node2{id=8,node_id=6,name="B-2的属性"},
                new node2{id=9,node_id=6,name="B-2的属性"},
            };


            //需要的格式:
            List<node> result = new List<node>
            {
                new node{id=1,patentId=0,name="A",
                        node2List=new List<node2>{/*这里是A的子元素(子元素可能还有子元素)、以及子元素的属性列表List<node2>*/},
                        nodeList=new List<node>{/*这里是A的属性列表List<node2>*/}},
                new node{id=2,patentId=0,name="B",node2List=new List<node2>{},nodeList=new List<node>{}},
                new node{id=3,patentId=0,name="C",node2List=new List<node2>{},nodeList=new List<node>{}},
            };
            //请教下要把nodeList、node2List的数据转化为result格式的数据,应该怎么递归?或其他写法?
           
           
        }

    }
}


请教下要把nodeList、node2List的数据转化为result格式的数据,应该怎么递归?或其他写法? --------------------编程问答-------------------- 这个不需要递归啊,foreach就行了 --------------------编程问答--------------------

//Is this what you want?
void Main()
{
 //数据格式:
List<node> nodeList = new List<node>{
new node{id=1,patentId=0,name="A"},
new node{id=2,patentId=0,name="B"},
new node{id=3,patentId=0,name="C"},
new node{id=4,patentId=1,name="A-1"},
new node{id=5,patentId=4,name="A-1-1"},
new node{id=6,patentId=2,name="B-1"},
new node{id=7,patentId=4,name="A-1-2"},
};
List<node2> node2List = new List<node2>{
new node2{id=1,node_id=1,name="A的属性"},
new node2{id=2,node_id=1,name="A的属性"},
new node2{id=3,node_id=1,name="A的属性"},
new node2{id=4,node_id=4,name="A-1的属性"},
new node2{id=5,node_id=5,name="A-1-1的属性"},
new node2{id=6,node_id=6,name="B-1的属性"},
new node2{id=7,node_id=2,name="B的属性"},
new node2{id=8,node_id=6,name="B-2的属性"},
new node2{id=9,node_id=6,name="B-2的属性"},
};

var result=(from n1 in nodeList 
  let tmp=GetSonID(nodeList,n1.id)
  select new node
  {
    id=n1.id,
    patentId=n1.patentId,
    name=n1.name,
nodeList=tmp.ToList(),
node2List=node2List.Where(x=>x.node_id==n1.id).ToList()
  }).ToList();
 
}
public IEnumerable<node> GetSonID(List<node> nodeList,int p_id)  
{  
var query = from c in nodeList  
   where c.patentId  == p_id  
   select c;  
   
return  query.ToList().Concat(query.ToList().SelectMany(t => GetSonID(nodeList,t.id)));                
}  

 public class node
{
public int id { set; get; }
public string name { set; get; }
public int patentId { set; get; }
public List<node> nodeList { set; get; }
public List<node2> node2List { set; get; }
}
public class node2
{
public int id { set; get; }
public int node_id { set; get; }//node_id是node的id
public string name { set; get; }
}
--------------------编程问答-------------------- 2楼的好像有点问题,nodelist的三级子元素没查询出来。。。

--------------------编程问答-------------------- static void Main(string[] args)       
        {             
            //数据格式:            
            List<node> nodeList = new List<node>{             
                new node{id=1,patentId=0,name="A"},            
                new node{id=2,patentId=0,name="B"},            
                new node{id=3,patentId=0,name="C"},            
                new node{id=4,patentId=1,name="A-1"},           
                new node{id=5,patentId=4,name="A-1-1"},              
                new node{id=6,patentId=2,name="B-1"},               
                new node{id=7,patentId=4,name="A-1-2"},           
            };            
            List<node2> node2List = new List<node2>{           
                new node2{id=1,node_id=1,name="A的属性"},         
                new node2{id=2,node_id=1,name="A的属性"},              
                new node2{id=3,node_id=1,name="A的属性"},             
                new node2{id=4,node_id=4,name="A-1的属性"},             
                new node2{id=5,node_id=5,name="A-1-1的属性"},             
                new node2{id=6,node_id=6,name="B-1的属性"},               
                new node2{id=7,node_id=2,name="B的属性"},                
                new node2{id=8,node_id=6,name="B-2的属性"},               
                new node2{id=9,node_id=6,name="B-2的属性"},          
            };            
            //需要的格式:         
            List<node> result = new List<node>{             
                new node{id=1,patentId=0,name="A",                 
                    node2List=new List<node2>{/*这里是A的子元素(子元素可能还有子元素)、以及子元素的属性列表List<node2>*/},        
                    nodeList=new List<node>{/*这里是A的属性列表List<node2>*/}},           
                    new node{id=2,patentId=0,name="B",node2List=new List<node2>{}, nodeList=new List<node>{}},             
                    new node{id=3,patentId=0,name="C",node2List=new List<node2>{},nodeList=new List<node>{}},          
            };             //请教下要把nodeList、node2List的数据转化为result格式的数据,应该怎么递归?或其他写法? 

           List<node> res= Getresult(nodeList, node2List);


            Console.ReadKey();
        }

        static List<node> Getresult(List<node> li1,List<node2> li2) {
            List<node> result = new List<node>();
            
            for (int i = 0; i < li1.Count; i++) {
                if (li1[i].patentId == 0)
                {
                    result.Add(new node()
                    {
                        id = li1[i].id,
                        patentId = li1[i].patentId,
                        name = li1[i].name,
                        nodeList = Getlistnode(li1[i], li1, li2),
                        node2List = Getlistnode(li1[i], li2)
                    });
                }
            }

            return result;

        }
        static List<node> Getlistnode(node n,List<node> li1,List<node2> li2) {
            List<node> listnode = new List<node>();
             for (int i = 0; i < li1.Count; i++) {
                 if (n.id == li1[i].patentId) {

                     listnode.Add(li1[i]);

                     List<node> lison = Getlistnode(li1[i], li1, li2);
                     li1[i].nodeList = lison;
                     li1[i].node2List = Getlistnode(li1[i], li2);
                 }
            }

             return listnode;
        }
        static List<node2> Getlistnode(node n, List<node2> li1)
        {
            List<node2> listnode2 = new List<node2>();
            for (int i = 0; i < li1.Count; i++)
            {
                if (n.id == li1[i].node_id)
                {  
                    listnode2.Add(li1[i]);
                }
            }

            return listnode2;
        },用linq的是大神呀 --------------------编程问答--------------------
static void Main(string[] args)       
        {             
            //数据格式:            
            List<node> nodeList = new List<node>{             
                new node{id=1,patentId=0,name="A"},            
                new node{id=2,patentId=0,name="B"},            
                new node{id=3,patentId=0,name="C"},            
                new node{id=4,patentId=1,name="A-1"},           
                new node{id=5,patentId=4,name="A-1-1"},              
                new node{id=6,patentId=2,name="B-1"},               
                new node{id=7,patentId=4,name="A-1-2"},           
            };            
            List<node2> node2List = new List<node2>{           
                new node2{id=1,node_id=1,name="A的属性"},         
                new node2{id=2,node_id=1,name="A的属性"},              
                new node2{id=3,node_id=1,name="A的属性"},             
                new node2{id=4,node_id=4,name="A-1的属性"},             
                new node2{id=5,node_id=5,name="A-1-1的属性"},             
                new node2{id=6,node_id=6,name="B-1的属性"},               
                new node2{id=7,node_id=2,name="B的属性"},                
                new node2{id=8,node_id=6,name="B-2的属性"},               
                new node2{id=9,node_id=6,name="B-2的属性"},          
            };            
            //需要的格式:         
            List<node> result = new List<node>{             
                new node{id=1,patentId=0,name="A",                 
                    node2List=new List<node2>{/*这里是A的子元素(子元素可能还有子元素)、以及子元素的属性列表List<node2>*/},        
                    nodeList=new List<node>{/*这里是A的属性列表List<node2>*/}},           
                    new node{id=2,patentId=0,name="B",node2List=new List<node2>{}, nodeList=new List<node>{}},             
                    new node{id=3,patentId=0,name="C",node2List=new List<node2>{},nodeList=new List<node>{}},          
            };             //请教下要把nodeList、node2List的数据转化为result格式的数据,应该怎么递归?或其他写法? 

           List<node> res= Getresult(nodeList, node2List);


            Console.ReadKey();
        }

        static List<node> Getresult(List<node> li1,List<node2> li2) {
            List<node> result = new List<node>();
            
            for (int i = 0; i < li1.Count; i++) {
                if (li1[i].patentId == 0)
                {
                    result.Add(new node()
                    {
                        id = li1[i].id,
                        patentId = li1[i].patentId,
                        name = li1[i].name,
                        nodeList = Getlistnode(li1[i], li1, li2),
                        node2List = Getlistnode(li1[i], li2)
                    });
                }
            }

            return result;

        }
        static List<node> Getlistnode(node n,List<node> li1,List<node2> li2) {
            List<node> listnode = new List<node>();
             for (int i = 0; i < li1.Count; i++) {
                 if (n.id == li1[i].patentId) {

                     listnode.Add(li1[i]);

                     List<node> lison = Getlistnode(li1[i], li1, li2);
                     li1[i].nodeList = lison;
                     li1[i].node2List = Getlistnode(li1[i], li2);
                 }
            }

             return listnode;
        }
        static List<node2> Getlistnode(node n, List<node2> li1)
        {
            List<node2> listnode2 = new List<node2>();
            for (int i = 0; i < li1.Count; i++)
            {
                if (n.id == li1[i].node_id)
                {  
                    listnode2.Add(li1[i]);
                }
            }

            return listnode2;
        }
--------------------编程问答-------------------- ,敲的好辛苦呢 --------------------编程问答-------------------- 再顶顶,目前不仅仅只有三级,可能有多级,不能都手写循环吧!
请教请教了
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,