出处:http://www.cnblogs.com/li-peng/

转换前的table:

转换后的table:

代码里有详细的说明,

还有一些参数我都截图了下面有

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 + "\t"));
Console.WriteLine();
//输出每行的信息
dt.Rows.Cast<DataRow>().ToList().ForEach(x =>
{
x.ItemArray.ToList().ForEach(y => Console.Write(y.ToString() + "\t\t"));
Console.WriteLine();
});
} #endregion
}
}

//以staff_TiCheng 字段为筛选条件  列转为行  下面有图

//   x[1] 是字段 staff_Name

y[2] 各种提成名字等于table中列的名字

作者:李鹏
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

【转】Linq实现DataTable行列转换的更多相关文章

  1. DataTable行列转换

    #region DataTable行列转换 /// <summary> /// DataTable行列转换 /// </summary> /// <param name= ...

  2. datatable 行列转换

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

  3. LINQ实现行列转换

    用SQL语句实现行列转换很容易,但也有时候需要在程序中实现,找了好久,发现一篇文章写的挺不错的 http://blog.csdn.net/smartsmile2012/article/details/ ...

  4. LinQ实现DataTable不定行转列 行列转换,有图

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="LinqDemo2.aspx.c ...

  5. 每日学习心得:Linq解决DataTable按照某一列的值排序问题/DataTable 导出CSV文件/巧用text-overflow解决数据绑定列数据展示过长问题

    2013-8-5 1 Linq解决DataTable按照某一列的值排序 在之前的总结中提到过对拼接而成的复合的DataTable按照某一列值的大小排序,那个主要的思想是在新建表结构时将要排序的那一列的 ...

  6. Oracle学习之路-- 案例分析实现行列转换的几种方式

    注:本文使用的数据库表为oracle自带scott用户下的emp,dept等表结构. 通过一个例子来说明行列转换: 需求:查询每个部门中各个职位的总工资 按我们最原始的思路可能会这么写:       ...

  7. SQL Server中行列转换 Pivot UnPivot

    SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...

  8. SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例,合并列的例子

    使用过SQL Server 2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQL Server 2005中,使用新引进的关键字PIVOT/UN ...

  9. 如何用Pivot实现行列转换

    在Oracle中,如果要实现行列转换,较为常见的是用DECODE和CASE语句.对于简单的行列转行,DECODE和CASE语句尚能应付.在逻辑比较复杂,分组聚合较多的场景中,DECODE和CASE语句 ...

随机推荐

  1. sql查询数据库表中重复记录方法

    1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 代码如下: select * from people where peopleId in (select peopleId ...

  2. NET-A-PORTER为何难以模仿?_全文显示_生活福布斯中文网

    NET-A-PORTER为何难以模仿?_全文显示_生活福布斯中文网 NET-A-PORTER为何难以模仿?

  3. ubuntu13.04安装SenchaArchitect-2.2无法启动的问题

    系统是ubuntukylin-13.04-desktop版本,不知道别的版本有没有这个问题,未测试.SenchaArchitect采用最新版本2.2.2,我安装的是32位的. 具体无法启动的问题如下: ...

  4. .net 文件下载

    /** 输入参数* _Request: Page.Request 对象* _Response: Page.Response 对象* _fileName: 下载文件名* _fullPath: 带文件名下 ...

  5. Ueditor和CKeditor 两款编辑器的使用与配置

    一丶ueditor 百度编辑器 1.官方文档,演示,下载地址:http://ueditor.baidu.com/website/index.html 2.百度编辑器的好:Editor是由百度web前端 ...

  6. UCML破解

    最近一直加班,好久没更新了.无良的产品经理一直催着修改功能,本想把活带回家做..结果...公司就一个UCML的加密狗...闹心....想办法破解: 1.狗复制,这个没搞过,某宝上有帮忙复制的,联系了一 ...

  7. VS2013无法链接到TFS (转)

    VS2013无法链接到TFS(Visual studio online),错误TF31001,TF31002   TF31002: Unable to connect to VisualStudio ...

  8. IO流操作-图片操作(二)

    一:Stream和Byte的含义 Stream:流,一般指文件流,内存流,可读的流和可写的流等,是一种数据转换的格式,流在计算机里可以表示为流输入或输出的一个连续的字节序列,它在使用完后,需要把资源释 ...

  9. 网络子系统48_ip协议数据帧的发送

    //ip协议与l4协议接口,l4通过此接口向下l3传递数据帧 //函数主要任务: // 1.通过路由子系统路由封包 // 2.填充l3报头 // 3.ip分片 // 4.计算校验和 // 5.衔接邻居 ...

  10. R与数据分析旧笔记(二)随机抽样的一个综合例子

    题目:模拟产生统计专业同学的名单(学号区分),记录数学分析.线性代数.概率统计三科成绩,然后进行一些统计分析 > num=seq(10378001,10378100) > num [1] ...