博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LINQ实现行列转换
阅读量:7050 次
发布时间:2019-06-28

本文共 2659 字,大约阅读时间需要 8 分钟。

用SQL语句实现行列转换很容易,但也有时候需要在程序中实现,找了好久,发现一篇文章写的挺不错的

用LINQ实现的行列转换,借鉴了他的办法,修改了下,达到了想要的效果

原始表:

想要达到的效果:

 

1  private void Form1_Load(object sender, EventArgs e) 2         { 3             //创建表,添加数据作为数据源 4             DataTable dtSource = new DataTable(); 5             dtSource.Columns.Add(new DataColumn("Name",typeof(string)));//姓名 6             dtSource.Columns.Add(new DataColumn("DateTime", typeof(string)));//日期 7             dtSource.Columns.Add(new DataColumn("WorkType", typeof(string)));//上班类型 8  9             dtSource.Rows.Add("张三","周一","早班");10             dtSource.Rows.Add("张三", "周二", "晚班");11             dtSource.Rows.Add("张三", "周三", "早班");12             dtSource.Rows.Add("小李", "周二", "早班");13             dtSource.Rows.Add("小李", "周四", "早班");14             dtSource.Rows.Add("小李", "周五", "早班");15             dtSource.Rows.Add("小王", "周一", "晚班");16             dtSource.Rows.Add("小王", "周三", "晚班");17             dtSource.Rows.Add("小王", "周五", "晚班");18 19             gc.DataSource=GetTable(dtSource); //输出转换后的表(这用的是DEV控件的GridView)20         }21 22         /// 23         /// 实现行列转换24         /// 25         private DataTable GetTable(DataTable dtSource)26         {27             //创建转换后的表,固定列28             DataTable dt = new DataTable();29             dt.Columns.Add("NAME", typeof(string));  //名称30             dt.Columns.Add("WEEK1", typeof(string)); //周一31             dt.Columns.Add("WEEK2", typeof(string)); //周二32             dt.Columns.Add("WEEK3", typeof(string)); //周三33             dt.Columns.Add("WEEK4", typeof(string)); //周四34             dt.Columns.Add("WEEK5", typeof(string)); //周五35             string[] times = new string[] { "周一", "周二", "周三", "周四", "周五" };//存放日期作为筛选条件36 37             //x[0]为NAME,按NAME 分组38             var data = from x in dtSource.Rows.Cast
()39 group x by x[0] into g40 select new { Key = g.Key.ToString(), Items = g };41 data.ToList().ForEach(x =>42 {43 string[] array = new string[dt.Columns.Count];44 array[0] = x.Key;//NAME45 int m = 0;46 for (int i = 1; i < dt.Columns.Count; i++)47 {48 array[i] = (from y in x.Items49 where y[1].ToString() == times[m] //y[1]为日期,上面的times为筛选条件50 select y[2].ToString()).SingleOrDefault();//筛选出来的上班类型51 m++;52 };53 dt.Rows.Add(array);54 }55 );56 return dt;57 }

 

输出的效果图:

转载于:https://www.cnblogs.com/mengyirensheng/p/3273123.html

你可能感兴趣的文章
基于Nginx和Memcache的负载均衡集群架构设计
查看>>
清除TextView周边空白区域
查看>>
互联网威胁狩猎框架 白皮书
查看>>
iOS开发-CocoaPods的安装与使用
查看>>
Android SDK Manager连不上Google服务器的解决办法
查看>>
js常用的事件
查看>>
正则表达式
查看>>
Mysql zip的下载地址
查看>>
Linux Swap交换分区介绍总结
查看>>
cross-platform-apps-qt-vs-html5
查看>>
python 协程 深入浅出(二)
查看>>
Go语言中的panic recover defer
查看>>
hotspot虚拟机对象
查看>>
Java注解学习总结
查看>>
ESXI 主机开启mob
查看>>
Linux USB 驱动开发(一)—— USB设备基础概念
查看>>
关于乱码问题的机理分析
查看>>
[译] 可工作软件的重要性
查看>>
Git :本地仓库提交到远程服务器
查看>>
Android开发在路上:少去踩坑,多走捷径【转】
查看>>