【问题标题】:DataTable Column Values to different Coulmns of DataTable [closed]DataTable的列值到DataTable的不同列[关闭]
【发布时间】:2013-10-07 14:34:20
【问题描述】:

我有一个包含两列(第 1 列 - 表名,第 2 列 - 列名)的 DataTable,即

Table_Name | Columns_Name |

SALES --------------   PROD_ID

SALES ----------------   SALES_ID

CUSTOMER ---------   CUST_ID

CUSTOMER ---------- CUST_NAME 

PRODUCT   ------------ PRODUCT_ID

PRODUCT   ------------ PRODUCT_NAME

我想通过在不同的列中添加每个 TableName 和相关字段来重组数据(使用现有的 DataTable 或通过创建新的 DataTable),即

Table_Name1 | Columns_Name1 |     Table_Name2 | Columns_Name2 |    Table_Name3 | Columns_Name3 |

SALES --------------   PROD_ID   | -----|CUSTOMER ---------   CUST_ID  | ------- |  PRODUCT   ------------ PRODUCT_ID



SALES ----------------   SALES_ID |------ |CUSTOMER ---------   CUST_NAME  | ------ |   PRODUCT   -------- PRODUCT_NAME  

主数据表将动态填充不同的表名和列名。 能否请您纠正一个示例代码/循环,它将获取具有相关字段的每个表并将它们按顺序放在不同的列中。

【问题讨论】:

标签: c# datatable datacolumn


【解决方案1】:
class Program
{
    static void Main(string[] args)
    {
        DataTable table = new DataTable();
        table.Columns.Add("Table_Name", typeof(string));
        table.Columns.Add("Column_Name", typeof(string));

        table.Rows.Add("SALES   ", "PROD_ID     ");
        table.Rows.Add("SALES   ", "SALES_ID    ");
        table.Rows.Add("CUSTOMER", "CUST_ID     ");
        table.Rows.Add("CUSTOMER", "CUST_NAME   ");
        table.Rows.Add("PRODUCT ", "PRODUCT_ID  ");
        table.Rows.Add("PRODUCT ", "PRODUCT_NAME");

        DataTable newTable = RotateDataTable(table, 0);

        foreach (DataRow dataRow in newTable.Rows)
        {
            foreach (var item in dataRow.ItemArray)
            {
                Console.Write("#" + item + "# ");
            }
            Console.WriteLine();
        }
    }

    private static DataTable RotateDataTable(DataTable table, int groupingColumn)
    {

        var grouped = table.AsEnumerable()
                .GroupBy(dr => dr.ItemArray[groupingColumn])
                .Select(grouping => grouping.ToList())
                .ToList();
        int count = grouped.Count;
        int rowCount = grouped[0].Count;
        if (!grouped.All(g => g.Count == rowCount))
            throw new Exception("Unexpected input");


        DataTable newTable = new DataTable();

        for (int i = 0; i < count; i++)
        {
            for (int j = 0; j < table.Columns.Count; j++)
                newTable.Columns.Add(table.Columns[j].ColumnName + (i + j));
        }

        for (int i = 0; i < rowCount; i++)
            newTable.Rows.Add(newTable.NewRow());

        for (int i = 0; i < count; i++)
        {
            var list = grouped[i].ToList();
            for (int j = 0; j < rowCount; j++)
            {
                for (int k = 0; k < list[j].ItemArray.Length; k++)
                {
                    string field = list[j].Field<string>(k);
                    int index = (i * table.Columns.Count) + k;
                    newTable.Rows[j].SetField<string>(index, field);
                }
            }
        }
        return newTable;
    }
}

【讨论】:

  • 谢谢 Ahmed 在此解决方案中,添加到 NewDataTable 的行数基于通过读取第一个分组列的长度定义的 rowCount (int rowCount = grouped[0].Count;)。这实际上限制了进入后续列的字段数量,即 grouped[0] TableName1 | ColumnName1 有 2 个字段。它将添加两行,但如果 TableName2 | ColumnName2 有 10 个字段。由于 NewDataTable 中只存在两行,因此只会添加前两条记录。
  • 我不理解反对票,我提供了帮助,答案不是“没有用”,因为它值得反对。我想为我回答,我只是想解决一个问题。碰巧这是一个SO问题。 @Kash您应该尝试根据您的需求调整此解决方案。
  • 嗨,艾哈迈德,我没有投反对票。我尝试了 upVote,但我需要至少 15 个声望。
  • 非常感谢 Ahmed Ahmed 为我提供的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多