Linq实现DataTable行转列效果
来源:互联网 发布:学编程要多少钱 编辑:程序博客网 时间:2024/06/05 23:04
在数据统计与分析中,经常会遇到将数据的行列进行转换整合,以更直观的展示分析结果。今天的C#程序将使用Linq实现DataTable行转列效果。
转换前的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
- Linq实现DataTable行转列效果
- Linq 实现 DataTable 行转列
- Linq 实现 DataTable 行转列
- Linq实现DataTable行转列
- LinQ实现DataTable不定行转列 行列转换
- LinQ实现DataTable不定行转列 行列转换
- LinQ实现DataTable不定行转列 行列转换,有图
- 通过Linq 实现DataTable Group By
- Linq实现DataTable的分组统计
- Linq实现DataTable动态去重复
- Linq Datatable
- datatable linq
- C# 用Linq实现DataTable实现重复数据过滤
- linq to datatable group by 多列 实现
- linq To DataTable 实现Group by 多个栏位
- Linq实现DaTaTable或者List里面数据值不重复
- Linq实现DaTaTable或者List里面数据值不重复
- 如何实现dorado的datatable整列单选效果
- yii发表文章之添加&修改
- jquery ajax 实现批量删除
- Android各层推荐开发书籍及参考资料
- 两个数相乘,小数点后的位数没有限制
- Android中App安装位置详解
- Linq实现DataTable行转列效果
- Ext省市级联下拉框
- java调用C的exe文件并传入参数,读出exe输出结果
- Qt教程一 —— 第十章:像丝一样滑
- 《Thinking In Java》笔记(4)
- VC操作EXCEL
- 使用Selenium测试Flex系列(1)
- Linux strace命令
- Linux Kernel Development 笔记(九)内核同步方法