在C#中重组(移调)数据表 [英] Restructuring (transposing) datatable in c#

查看:161
本文介绍了在C#中重组(移调)数据表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有类似下面的DataTable

I have a datatable like below

    TableName   RowId   columnname  ColumnValue
    A           1       C1          V1
    A           1       C2          V2
    A           2       C1          V3
    A           2       C2          V4

我要转以下结构

    TableName RowId C1 C2
    A         1     V1 V2
    A         2     V3 V4

如何做到在C#?

How to do it in C#?

推荐答案

我prepared有点复杂的解决方案,这并不需要什么样的价值观在里面的ColumnName 隐藏源列数据表

I prepared a little complex solution, which does not require what values are hidden inside ColumnName column of source DataTable:

源代码数据表 preparation:

Source DataTable preparation:

var source = new DataTable();
source.Columns.Add(new DataColumn("TableName", typeof(string)));
source.Columns.Add(new DataColumn("RowId", typeof(int)));
source.Columns.Add(new DataColumn("ColumnName", typeof(string)));
source.Columns.Add(new DataColumn("ColumnValue", typeof(string)));

source.Rows.Add("A", 1, "C1", "V1");
source.Rows.Add("A", 1, "C2", "V2");
source.Rows.Add("A", 2, "C1", "V3");
source.Rows.Add("A", 2, "C2", "V4");

目标数据表 preparation:

Target DataTable preparation:

var target = new DataTable();
target.Columns.Add(new DataColumn("TableName", typeof(string)));
target.Columns.Add(new DataColumn("RowId", typeof(int)));

帮助LINQ查询:

Helper LINQ query:

var query = from r in source.AsEnumerable()
            let i = new
            {
                TableName = r.Field<string>("TableName"),
                Id = r.Field<int>("RowId"),
                ColumnName = r.Field<string>("ColumnName"),
                ColumnValue = r.Field<string>("ColumnValue")
            }
            group i by new { i.TableName, i.Id } into g
            select g;

将数据插入目标 数据表

foreach (var item in query)
{
    var newRow = target.NewRow();

    // static columns
    newRow["TableName"] = item.Key.TableName;
    newRow["RowId"] = item.Key.Id;

    // dynamic columns
    foreach (var c in item)
    {
        if(!target.Columns.Contains(c.ColumnName))
        {
            target.Columns.Add(new DataColumn(c.ColumnName, typeof(String)));
        }

        newRow[c.ColumnName] = c.ColumnValue;
    }

    target.Rows.Add(newRow);
}

这篇关于在C#中重组(移调)数据表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆