出处: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. MojoliciousLite: 实时的web框架 概述

    MojoliciousLite: 实时的web框架: SYNOPSIS 简介: # Automatically enables "strict", "warnings&q ...

  2. UberX及以上级别车奖励政策(优步北京第四组)

    优步北京第四组: 定义为2015年7月20日至今激活的司机(以优步后台数据显示为准) 滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何注册Uber司机(全国版最新最详细 ...

  3. web - 块元素和内嵌元素的特征

    块: 1.独占一行 2.支持所有的样式 3.不设置宽度的时候,宽度撑满整行 常用的快标签有: div,section,header,nav,footer,article,aside,ul,ol,li, ...

  4. Ext.Net 使用总结之查询条件中的起始日期

    2.关于查询条件中起始日期的布局方式 首先上一张图,来展示一下我的查询条件的布局,如下: 大多数时候,我们的查询条件都是一个条件占一个格子,但也有不同的时候,如:查询条件是起始日期,则需要将这两个条件 ...

  5. 2014.9.20CSS样式表

    一.前景与背景 background-color: 背景色,定义背景的颜色 background-image:url() 定义背景图片 background-attachment:fixed/scro ...

  6. [转]spring 监听器 IntrospectorCleanupListener简介

    "在服务器运行过程中,Spring不停的运行的计划任务和OpenSessionInViewFilter,使得Tomcat反复加载对象而产生框架并用时可能产生的内存泄漏,则使用Introspe ...

  7. 获取extjs text列修改过 数据

    ExtJS中表格的特性简介 表格由类Ext.grid.GridPanel定义,继承自Ext.Panel,xtype为grid 表格的列信息由Ext.grid.ColumnModel定义 表格的数据存储 ...

  8. 全局通知Notification

    Notification 全局通知 关于全局通知的个人理解: 即有一个发射消息的,在整个应用中任何对象都可以接受这个消息 但是无论是哪个对象接受消息,都要在这个对象结束时移除消息 简单的说 就是给对象 ...

  9. realloc,c语言

    realloc #include <stdlib.h> main() { char* ptr=NULL; char* ptr2=NULL; ptr = malloc(); printf(& ...

  10. USACO Section 4.3 Buy low,Buy lower(LIS)

    第一眼看到题目,感觉水水的,不就是最长下降子序列嘛!然后写……就呵呵了..要判重,还要高精度……判重我是在计算中加入各种判断.这道题比看上去麻烦一点,但其实还好吧.. #include<cstd ...