I have a DataTable with two columns (Column 1 - Table Name , Column2 - Column Name) i.e.

Table_Name | Columns_Name |

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

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

CUSTOMER ---------   CUST_ID

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

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

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

I would like to restructure (either using existing DataTable or by creating new DataTable) the data by adding each TableName and relevant field in different column i.e.

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  

The main DataTable will be filled dynamically with different TableNames and ColumnNames. Could you please right a sample code/ Loop, that will take each Table with relevant field and put them sequentially in different columns.

有帮助吗?

解决方案

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;
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top