zoukankan      html  css  js  c++  java
  • linq行转列

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

    namespace ConvertToTable
    {
    class Program
    {
    static void Main(string[] args)
    {
    #region 添加一个表
    DataTable _dt = new DataTable();
    _dt.Columns.Add(new DataColumn("staff_id", typeof(int)) { DefaultValue = 0 }); //员工 id
    _dt.Columns.Add(new DataColumn("staff_Name", typeof(string)) { DefaultValue = "1" }); //员工名字
    _dt.Columns.Add(new DataColumn("staff_TiCheng", typeof(string)) { DefaultValue = "1" });//员工提成规则
    _dt.Columns.Add(new DataColumn("staff_TiChengAmount", typeof(double)) { DefaultValue = 0 }); //提成钱数

    _dt.Rows.Add(1, "小李", "零点提成", 60);
    _dt.Rows.Add(1, "小李", "订房提成", 70);
    _dt.Rows.Add(2, "小张", "零点提成", 500);
    _dt.Rows.Add(2, "小张", "订房提成", 60);
    _dt.Rows.Add(2, "小张", "订单提成", 800);
    _dt.Rows.Add(3, "小王", "零点提成", 30);
    _dt.Rows.Add(3, "小王", "订单提成", 900);
    #endregion
    //输出原始表
    Console.WriteLine("原始表:");
    DisplayTable(_dt);
    //输出行转列以后的表
    Console.WriteLine("转换以后的表:");
    DisplayTable(ConvertToTable(_dt));
    Console.ReadLine();
    }

    #region 转换表
    static DataTable ConvertToTable(DataTable source)
    {
    DataTable dt = new DataTable();
    //前两列是固定的加上
    dt.Columns.Add("staff_id");
    dt.Columns.Add("staff_Name");
    //以staff_TiCheng 字段为筛选条件 列转为行 下面有图
    var columns = (from x in source.Rows.Cast<DataRow>() select x[2].ToString()).Distinct();
    //把 staff_TiCheng 字段 做为新字段添加进去
    foreach (var item in columns) dt.Columns.Add(item).DefaultValue = 0;
    // x[1] 是字段 staff_Name 按 staff_Name分组 g 是分组后的信息 g.Key 就是名字 如果不懂就去查一个linq group子句进行分组
    var data = from x in source.Rows.Cast<DataRow>()
    group x by x[1] into g
    select new { Key = g.Key.ToString(), Items = g };
    data.ToList().ForEach(x =>
    {
    //这里用的是一个string 数组 也可以用DataRow根据个人需要用
    string[] array = new string[dt.Columns.Count];
    //array[1]就是存名字的
    array[1] = x.Key;
    //从第二列开始遍历
    for (int i = 2; i < dt.Columns.Count; i++)
    {
    // array[0] 就是 staff_id
    if (array[0] == null)
    array[0] = x.Items.ToList<DataRow>()[0]["staff_id"].ToString();
    //array[0] = (from y in x.Items
    // where y[2].ToString() == dt.Columns[i].ToString()
    // select y[0].ToString()).SingleOrDefault();
    //array[i]就是 各种提成
    array[i] = (from y in x.Items
    where y[2].ToString() == dt.Columns[i].ToString()// y[2] 各种提成名字等于table中列的名字
    select y[3].ToString() // y[3] 就是我们要找的 staff_TiChengAmount 各种提成 的钱数
    ).SingleOrDefault();
    }
    dt.Rows.Add(array); //添加到table中
    });
    return dt;
    }
    /// <summary>
    /// 输出表
    /// </summary>
    /// <param name="dt"></param>
    static void DisplayTable(DataTable dt)
    {
    //输出列的标题
    dt.Columns.Cast<DataColumn>().ToList().ForEach(x => Console.Write(x + " "));
    Console.WriteLine();
    //输出每行的信息
    dt.Rows.Cast<DataRow>().ToList().ForEach(x =>
    {
    x.ItemArray.ToList().ForEach(y => Console.Write(y.ToString() + " "));
    Console.WriteLine();
    });
    }

    #endregion
    }
    }

  • 相关阅读:
    Linux 安装apache2时候遇到的问题
    ubuntu安装php时出现error: xml2config not found. Please check your libxml2 installation 的解决办法
    Linux一块网卡绑定2个IP地址
    php 满足条件后跳转的几种方法.
    Linux 安装php 遇到 libtool: link: `ext/date/php_date.lo' is not a valid libtool object
    js 光标移动到输入框最后位置函数
    Linux iptables 防火墙相关命令介绍及使用
    tcpdump的简单选项介绍
    子网掩码转换函数
    Linux 十六进制转换十进制的函数
  • 原文地址:https://www.cnblogs.com/hn_lijia/p/11784837.html
Copyright © 2011-2022 走看看