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 WindowsFormsApplication6
{
    public partial class Form1 : Form
    {

        List<data> ldt = new List<data>();

        public Form1()
        {
            InitializeComponent();
        }

        private IEnumerable<data>  vv(List<data> ldtIn,IEnumerable<data> ien)
        {
            var v2 = ldtIn.Where(rec => rec.pid == 0).Select(rec => new data(rec.pid, rec.id, rec.falg, 0));

            var v1 = ldtIn.Join(ien, l=>l.pid, i=>i.id, (l,i)=>(new data(l.pid,l.id,l.falg,i.level+1)));
            
            var v3 = v2.Union(v1);

            if (v3.Count() == ien.Count())
                return v3;

            return vv(ldtIn, v3).Where(rec=>rec.level==2);
        }



        private IEnumerable<data> bb(List<data> ldtIn, IEnumerable<data> all, IEnumerable<data> last)
        {
            var v1 = ldtIn.Join(last, l => l.pid, i => i.id, (l, i) => (new data(l.pid, l.id, l.falg, i.level + 1)));

            if (v1.Count() == 0)
            {
                return all;
            }

            all = all.Union(v1);
            last = v1;

            return bb(ldtIn, all, last);
        }


        private void button1_Click(object sender, EventArgs e)
        {
            ldt.Add(new data(0, 1, 1));
            ldt.Add(new data(1, 2, 2));
            ldt.Add(new data(2, 3, 3));
            ldt.Add(new data(2, 4, 4));
            ldt.Add(new data(3, 5, 5));


            ldt.Add(new data(0, 6, 6));
            ldt.Add(new data(6, 7, 7));
            ldt.Add(new data(7, 8, 8));
            ldt.Add(new data(7, 9, 9));

            IEnumerable<data> all = ldt.Where(rec => rec.pid == 1).Select(rec => new data(rec.pid, rec.id, rec.falg, 1));
            IEnumerable<data> last = all;

            dataGridView1.DataSource = null;
            dataGridView1.DataSource = bb(ldt, all, last).ToList();
        }
    }

    public class data
    {
        public data(int pid, int id, int falg)
        {
            this.pid = pid;
            this.id = id;
            this.falg = falg;
        }
        public data(int pid, int id, int falg, int level)
        {
            this.pid = pid;
            this.id = id;
            this.falg = falg;
            this.level = level;
        }

        public int pid;

        public int id;

        public int falg;

        public int level;

            
        public int Level
        {
            get
            {
                return level;
            }
            set
            {
                level = value;
            }
        }
        public int Pid
        {
            get
            {
                return pid;
            }
            set
            {
                pid = value;
            }
        }

        public int Id
        {
            get
            {
                return id;
            }
            set
            {
                id = value;
            }
        }

        public int Falg
        {
            get
            {
                return falg;
            }
            set
            {
                falg = value;
            }
        }
    }
}



本文转载:CSDN博客