Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数据表组和数据透视_C#_.net - Fatal编程技术网

C# 数据表组和数据透视

C# 数据表组和数据透视,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 |

我有一个结构如下的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   |
实现这一目标的最快方法是什么

编辑: 我已经为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”];
}
}

最快的方法是什么?有人给你密码的最快方法?您自己实现它的最快方法?最快的表现?有许多文章介绍如何检索数据。