linq group by

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;
using SynapticEffect.Forms;

namespace MyTest
{
    public partial class Form1 : Form
    {

        DataTable dt;
        public Form1()
        {
            InitializeComponent();
            CreateTable();
        }

        private void CreateTable()
        {
            dt = new DataTable();
            DataColumn dc1 = new DataColumn("ID", typeof(int));
            DataColumn dc2 = new DataColumn("ProjectName", typeof(string));
            DataColumn dc3 = new DataColumn("DrawingType", typeof(string));
            DataColumn dc4 = new DataColumn("SubItem", typeof(string));
            DataColumn dc5 = new DataColumn("Content", typeof(string));
            dt.Columns.AddRange(new DataColumn[] { dc1, dc2, dc3, dc4, dc5 });

            string name="深圳湾";
            string drawingtype1="白图";
            string drawingtype2 = "蓝图";
            string myitem1 = "深圳湾体育场";
            string myitem2="深圳湾游泳馆";

            for (int i = 0; i < 1000; i++)
            {
                DataRow row = dt.NewRow();
                row["ID"]=i;
                row["ProjectName"] = name;
                row["Content"] = string.Format("内容{0}",i);
                if (i % 5 == 0)
                {
                    row["DrawingType"] = drawingtype1;
                    row["SubItem"] = string.Format("项{0}", i);
                }
                else if (i % 7 == 0)
                {
                    row["DrawingType"] = string.Format("图{0}", i);
                    row["SubItem"] = myitem1;
                }
                else if (i % 13 == 0)
                {
                    row["DrawingType"] = drawingtype2;
                    row["SubItem"] = string.Format("项{0}", i);
                }
                else if (i % 17 == 0)
                {
                    row["SubItem"] = myitem2;
                    row["DrawingType"] = string.Format("图{0}", i);
                }
                else
                {
                    row["DrawingType"] = string.Format("图{0}",i);
                    row["SubItem"] = string.Format("项{0}",i);
                }
                dt.Rows.Add(row);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //DataRow[] rows=dt.Select("group by SubItem,DrawingType");
            treeListView1.Columns.Clear();
            ToggleColumnHeader ch1 = new ToggleColumnHeader();
            ch1.Text = "子项";
            ToggleColumnHeader ch2 = new ToggleColumnHeader();
            ch2.Text="图别";
            ToggleColumnHeader ch3 = new ToggleColumnHeader();
            ch3.Text = "内容";
            this.treeListView1.Columns.AddRange(new ToggleColumnHeader[] { ch1, ch2, ch3 });


            //IEnumerable<IGrouping<string, DataRow>> result = dt.Rows.Cast<DataRow>().GroupBy<DataRow, string>(dr => dr["SubItem"].ToString());
            //foreach (IGrouping<string, DataRow> ig in result)
            //{
            //    TreeListNode gnode = new TreeListNode();
            //    gnode.Tag = ig;
            //    gnode.Text = ig.ToString();
            //    gnode.SubItems.Add(string.Empty);
            //    gnode.SubItems.Add(string.Empty);
            //    this.treeListView1.Nodes.Add(gnode);
            //    foreach (var row in ig)
            //    {
            //        TreeListNode node = new TreeListNode();
            //        node.Tag = row["ID"];
            //        node.Text = (row["SubItem"].ToString());
            //        node.SubItems.Add(row["DrawingType"].ToString());
            //        node.SubItems.Add(row["Content"].ToString());
            //        gnode.Nodes.Add(node);
            //    }
            //}

 

            var grouped1 = from row in dt.AsEnumerable()
                           group row by new { T = row["SubItem"] } into valueGroup
                           select new { Value = valueGroup.Key, SubItem = valueGroup.Max(SubItem => SubItem["SubItem"]) };
            foreach (var ig in grouped1)
            {
                TreeListNode gnode = new TreeListNode();
                gnode.Tag = ig;
                gnode.Text = ig.SubItem.ToString();
                gnode.SubItems.Add(string.Empty);
                gnode.SubItems.Add(string.Empty);
                this.treeListView1.Nodes.Add(gnode);
            }

            var grouped2 = from row in dt.AsEnumerable()
                           group row by new { T = row["DrawingType"] } into valueGroup
                           select new { Value = valueGroup.Key, DrawingType = valueGroup.Max(DrawingType => DrawingType["DrawingType"]) };
            foreach (var ig in grouped2)
            {
                TreeListNode gnode = new TreeListNode();
                gnode.Tag = ig;
                gnode.Text = ig.DrawingType.ToString();
                gnode.SubItems.Add(string.Empty);
                gnode.SubItems.Add(string.Empty);
                this.treeListView1.Nodes.Add(gnode);
            }


        }

         

        

    }
}


 关于List的Linq

            List<Employee> empList = new List<Employee>();
            empList.Add(new Employee() {
                ID = 1, FName = "John", Age = 23, Sex = 'M'
            });
            empList.Add(new Employee() {
                ID = 2, FName = "Mary", Age = 25, Sex = 'F'
            });

            empList.Add(new Employee() {
                ID = 3, FName = "Amber", Age = 23, Sex = 'M'
            });
            empList.Add(new Employee() {
                ID = 4, FName = "Kathy", Age = 25, Sex = 'M'
            });
            empList.Add(new Employee() {
                ID = 5, FName = "Lena", Age = 27, Sex = 'F'
            });

            empList.Add(new Employee() {
                ID = 6, FName = "Bill", Age = 28, Sex = 'M'
            });

            empList.Add(new Employee() {
                ID = 7, FName = "Celina", Age = 27, Sex = 'F'
            });
            empList.Add(new Employee() {
                ID = 8, FName = "John", Age = 28, Sex = 'M'
            }); 
            //接下来的做法是:
            // 实现多key分组的扩展函数版本
            var sums = empList
                        .GroupBy(x => new { x.Age, x.Sex })
                        .Select(group => new {
                        Peo = group.Key, Count = group.Count()
                        });
            foreach (var employee in sums) {
                //Console.WriteLine(employee.Count + ": " + employee.Peo);
                TreeListNode gnode = new TreeListNode();
                gnode.Tag = employee;
                gnode.Text = employee.Peo.ToString();
                gnode.SubItems.Add(string.Empty);
                gnode.SubItems.Add(string.Empty);
                this.treeListView1.Nodes.Add(gnode);
            }

            // 实现多key分组的lambda版本
            var sums2 = from emp in empList
                        group emp by new { emp.Age, emp.Sex } into g
                        select new { Peo = g.Key, Count = g.Count() };
            foreach (var employee in sums) {
                //Console.WriteLine(employee.Count + ": " + employee.Peo);
            }


 

    class Employee
    {
        public int ID { get; set; }
        public string FName { get; set; }
        public int Age { get; set; }
        public char Sex { get; set; }
    } 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值