Linq to DataTable之动态分组

对一个DataTable的数据进行Group By,常规的做法只能在程序里预先指定分组的列,研究了一下自定义动态分组:

using System;
using System.Text;
using System.Linq;
using System.Data;
using System.Collections.Generic;
using System.Collections;
using System.Linq.Expressions;
using System.Xml.Linq;

public static void Main()
{
	DataTable dataTable1 = new DataTable();
	dataTable1.Columns.AddRange(new[]
	{
	new DataColumn("DEPT"),
	new DataColumn("SUBDEPT"),
	new DataColumn("EMPNO"),
	new DataColumn("NAME")
	});
	dataTable1.Rows.Add(new[] { "部门1", "组1", "001", "用户1"});
	dataTable1.Rows.Add(new[] { "部门1", "组1", "002", "用户2"});
	dataTable1.Rows.Add(new[] { "部门1", "组2", "003", "用户3"});
	dataTable1.Rows.Add(new[] { "部门2", "组1", "004", "用户4"});
	dataTable1.Rows.Add(new[] { "部门2", "组2", "005", "用户5"});
	dataTable1.Rows.Add(new[] { "部门2", "组2", "006", "用户6"});

	//固定分组列
	var groupedData = from row in dataTable1.AsEnumerable()
					  group row by new { col1 = row.Field<string>("DEPT"), col2 = row.Field<string>("SUBDEPT") } into m
					  select new
					  {
						  DEPT = m.First().Field<string>("DEPT"),
						  SUBDEPT = m.First().Field<string>("SUBDEPT"),
						  COUNT = m.Count()
					  };
	foreach (var group in groupedData)
	{
		Console.WriteLine(string.Format("DEPT:{0},SUBDEPT:{1},USER COUNT={2}", group.DEPT, group.SUBDEPT, group.COUNT));
	}

	Console.WriteLine("-----------------------------------------------------------------------");

	//自定义分组列
	var groupColumns = new []{"DEPT", "SUBDEPT"}.ToList();
	var groupedData2 = dataTable1.AsEnumerable().GroupBy(dataRow =>
	{
		var stringBuilder = new StringBuilder();
		groupColumns.ForEach(column => stringBuilder.Append(dataRow[column].ToString()));
		return stringBuilder.ToString();
	});

	foreach (var group in groupedData2)
	{
		var row = group.First();
		Console.WriteLine(string.Format("DEPT:{0},SUBDEPT:{1},USER COUNT={2}", row.Field<string>("DEPT"), row.Field<string>("SUBDEPT"), group.Count()));
	}

	Console.ReadKey();

	/* Out put:
	DEPT:部门1,SUBDEPT:组1,USER COUNT=2
	DEPT:部门1,SUBDEPT:组2,USER COUNT=1
	DEPT:部门2,SUBDEPT:组1,USER COUNT=1
	DEPT:部门2,SUBDEPT:组2,USER COUNT=2
	-----------------------------------------------------------------------
	DEPT:部门1,SUBDEPT:组1,USER COUNT=2
	DEPT:部门1,SUBDEPT:组2,USER COUNT=1
	DEPT:部门2,SUBDEPT:组1,USER COUNT=1
	DEPT:部门2,SUBDEPT:组2,USER COUNT=2 
	 */
}

参考: http://www.codeproject.com/Articles/24961/Linq-Group-By-over-multiple-keys-columns-on-an-in
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值