C# 数据表组和数据透视
我有一个结构如下的DTC# 数据表组和数据透视,c#,.net,C#,.net,我有一个结构如下的DT unit | value | date ------------------------- A | 2 | 01-01-2000 B | 3 | 01-01-2000 A | 4 | 02-01-2000 我想将其转换为以下内容 | A | B --------------------------- 01-01-2000 | 2 | 3 02-01-2000 | 4 |
unit | value | date
-------------------------
A | 2 | 01-01-2000
B | 3 | 01-01-2000
A | 4 | 02-01-2000
我想将其转换为以下内容
| A | B
---------------------------
01-01-2000 | 2 | 3
02-01-2000 | 4 |
实现这一目标的最快方法是什么
编辑:
我已经为pivot实现了一个函数,它提供了以下内容:
| A | B | A
--------------------------------------
value | 2 | 3 | 4
date |01-01-2000|01-01-2000|02-01-2000
但在本例中,我缺少按列分组
我所说的“最快”是指实现这一点的最短代码(LINQ?)。或者可以在同一个查询中同时实现pivot?试试这个
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add("unit", typeof(string));
dt.Columns.Add("value", typeof(int));
dt.Columns.Add("date", typeof(DateTime));
dt.Rows.Add(new object[] { "A",2, DateTime.Parse("01-01-2000")});
dt.Rows.Add(new object[] { "B",3, DateTime.Parse("01-01-2000")});
dt.Rows.Add(new object[] { "A",4, DateTime.Parse("02-01-2000")});
string[] uniqueUnits = dt.AsEnumerable().Select(x => x.Field<string>("unit")).Distinct().ToArray();
DataTable dt1 = new DataTable();
dt1.Columns.Add("date", typeof(DateTime));
foreach (string unit in uniqueUnits)
{
dt1.Columns.Add(unit, typeof(int));
}
var groups = dt.AsEnumerable().GroupBy(x => x.Field<DateTime>("date"));
foreach (var group in groups)
{
DataRow newRow = dt1.Rows.Add();
foreach (DataRow row in group)
{
newRow["date"] = group.Key;
newRow[row.Field<string>("unit")] = row.Field<int>("value");
}
}
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统数据;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
DataTable dt=新的DataTable();
添加(“单位”,类型(字符串));
添加(“值”,类型(int));
添加(“日期”,类型(日期时间));
Add(新对象[]{“A”,2,DateTime.Parse(“01-01-2000”)});
Add(新对象[]{“B”,3,DateTime.Parse(“01-01-2000”)});
Add(新对象[]{“A”,4,DateTime.Parse(“02-01-2000”)});
字符串[]uniqueUnits=dt.AsEnumerable()。选择(x=>x.Field(“unit”)).Distinct().ToArray();
DataTable dt1=新DataTable();
dt1.Columns.Add(“日期”,typeof(DateTime));
foreach(以唯一单位表示的字符串单位)
{
dt1.Columns.Add(单位,类型(int));
}
var groups=dt.AsEnumerable().GroupBy(x=>x.Field(“日期”);
foreach(组中的var组)
{
DataRow newRow=dt1.Rows.Add();
foreach(组中的数据行)
{
newRow[“date”]=组键;
newRow[行字段(“单位”)]=行字段(“值”);
}
}
}
}
}
代码行数更多,但也只能通过一个循环完成:
DataTable dt1 = new DataTable();
dt1.Columns.Add(new DataColumn("unit",typeof(string)));
dt1.Columns.Add(new DataColumn("value",typeof(int)));
dt1.Columns.Add(new DataColumn("date",typeof(DateTime)));
dt1.Rows.Add(new object[] { "A", 2, DateTime.Parse("01-01-2000") });
dt1.Rows.Add(new object[] { "B", 3, DateTime.Parse("01-01-2000") });
dt1.Rows.Add(new object[] { "A", 4, DateTime.Parse("02-01-2000") });
DataTable dt2 = new DataTable();
dt2.Columns.Add(new DataColumn("date", typeof(DateTime)));
dt2.PrimaryKey = new DataColumn[] { dt2.Columns["date"], };
List<string> cols = new List<string>();
List<DateTime> ds = new List<DateTime>();
foreach (DataRow dr1 in dt1.Rows)
{
string unit = dr1["unit"].ToString();
if (!cols.Contains(unit))
{
dt2.Columns.Add(new DataColumn(unit, typeof(int)));
cols.Add(unit);
}
DateTime pkDate = (DateTime)dr1["date"];
if (!ds.Contains(pkDate))
{
ds.Add(pkDate);
DataRow dr = dt2.NewRow();
dr["date"] = dr1["date"];
dr[unit] = dr1["value"];
dt2.Rows.Add(dr);
}
else
{
dt2.Rows.Find(pkDate)[unit] = dr1["value"];
}
}
DataTable dt1=newdatatable();
添加(新的数据列(“单位”,类型(字符串));
添加(新的数据列(“value”,typeof(int));
添加(新的数据列(“日期”,typeof(DateTime));
添加(新对象[]{“A”,2,DateTime.Parse(“01-01-2000”)});
添加(新对象[]{“B”,3,DateTime.Parse(“01-01-2000”)});
添加(新对象[]{“A”,4,DateTime.Parse(“02-01-2000”)});
DataTable dt2=新的DataTable();
添加(新的数据列(“日期”,typeof(DateTime));
dt2.PrimaryKey=newdatacolumn[]{dt2.Columns[“date”],};
List cols=新列表();
List ds=新列表();
foreach(dt1.Rows中的数据行dr1)
{
字符串单位=dr1[“单位”]。ToString();
如果(!列包含(单位))
{
添加(新的数据列(单位,类型(int));
列加(单位);
}
DateTime pkDate=(DateTime)dr1[“日期”];
如果(!ds.Contains(pkDate))
{
ds.Add(pkDate);
DataRow dr=dt2.NewRow();
dr[“日期”]=dr1[“日期”];
dr[单位]=dr1[“值”];
dt2.Rows.Add(dr);
}
其他的
{
dt2.Rows.Find(pkDate)[unit]=dr1[“value”];
}
}
最快的方法是什么?有人给你密码的最快方法?您自己实现它的最快方法?最快的表现?有许多文章介绍如何检索数据。