【问题标题】:Swapping rows as a Columns将行交换为列
【发布时间】:2017-06-20 22:08:21
【问题描述】:

我有如下数据表;

Systime       |   Name | Value
-----------------------------
 01.04.2017   Water       12
 01.04.2017   Bread       14
 01.04.2017   Chair       11
 02.04.2017   Water       25
 02.04.2017   Bread       16
 02.04.2017   Chair       21

我想使用 linq 或 etc 将行与下面的列交换;

   systime | Water | Bread | Chair
-------------------------------
01.04.2017     12     14      11
02.04.2017     25     16      21

【问题讨论】:

  • 你尝试了什么
  • @BRAHIMKamel 问题是我不知道路。搜索了很多,但没有运气。
  • @kblok 情况不同。我查看并尝试申请但没有成功。

标签: c# .net linq


【解决方案1】:

这是构建数据透视表的方法

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("Systime", typeof(DateTime));
            dt.Columns.Add("Name", typeof(string));
            dt.Columns.Add("Value", typeof(int));

            dt.Rows.Add(new object[] { DateTime.Parse("01/04/2017"),"Water", 12});
            dt.Rows.Add(new object[] { DateTime.Parse("01/04/2017"),"Bread", 14});
            dt.Rows.Add(new object[] { DateTime.Parse("01/04/2017"),"Chair", 11});
            dt.Rows.Add(new object[] { DateTime.Parse("02/04/2017"),"Water", 25});
            dt.Rows.Add(new object[] { DateTime.Parse("02/04/2017"),"Bread", 16});
            dt.Rows.Add(new object[] { DateTime.Parse("02/04/2017"),"Chair", 21});

            string[] items = dt.AsEnumerable().Select(x => x.Field<string>("Name")).Distinct().ToArray();

            DataTable pivot = new DataTable();
            pivot.Columns.Add("Systime", typeof(DateTime));
            foreach(string item in items)
            {
                pivot.Columns.Add(item, typeof(int));
            }

            var groups = dt.AsEnumerable().GroupBy(x => x.Field<DateTime>("Systime")).ToList();

            int index = 0;
            foreach (var group in groups)
            {

                DataRow newRow = pivot.Rows.Add();
                newRow[0] = group.Key;
                foreach (string item in items)
                {
                    newRow[item] = group.Where(x => x.Field<string>("Name") == item).Select(x => x.Field<int>("Value")).Sum();
                }
            }

        }
    }


}

【讨论】:

  • 谢谢。它工作得很好。但是,systime 怎么不会出现在网格中,我看到 int index=0 并且从未使用过。为什么会在那里?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2015-04-25
  • 2020-02-19
相关资源
最近更新 更多