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