zoukankan      html  css  js  c++  java
  • LINQ实现行列转换

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

    http://blog.csdn.net/smartsmile2012/article/details/8259192

    用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         /// <summary>
    23         /// 实现行列转换
    24         /// </summary>
    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<DataRow>()
    39                        group x by x[0] into g
    40                        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;//NAME
    45                 int m = 0;
    46                 for (int i = 1; i < dt.Columns.Count; i++)
    47                 {
    48                     array[i] = (from y in x.Items
    49                                 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         }

    输出的效果图:

  • 相关阅读:
    非root用户加入docker用户组省去sudo
    walle2.0 nginx.conf配置文件参数
    CentOS7.6 yum方式安装mysql2.7.25
    云服务器Ubuntu 14.04.2和centos7.5实现nfs挂载
    fs.inotify.max_user_watches默认值太小,导致too many open files
    CentOS7.X首次安装docker无法启动的问题解决
    【转载】Linux启动初始化配置文件浅析(解决source /etc/profile重启后就失效?)
    Apache:SSLCertificateFile:文件不存在或为空(操作系统RHEL7)
    20181023红帽学习笔记
    Undefined symbols for architecture x86_64:
  • 原文地址:https://www.cnblogs.com/mengyirensheng/p/3273123.html
Copyright © 2011-2022 走看看