2013-10-07 3 views
-4

У меня есть DataTable с двумя столбцами (колонка 1 - Название таблицы, COLUMN2 - Имя столбца) т.е.DataTable Значения столбцов в разных Coulmns из DataTable

Table_Name | Columns_Name | 

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

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

CUSTOMER --------- CUST_ID 

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

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

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

Я хотел бы реструктурировать (либо с использованием существующих DataTable или создание новых DataTable) данные, добавляя каждый TableName и соответствующее поле в различном колонке т.е.

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 

Основной объект DataTable будет заполнен динамически с различным TableNames и ColumnNames. Не могли бы вы выбрать образец кода/Loop, который будет принимать каждую таблицу с соответствующим полем и последовательно помещать их в разные столбцы.

+0

возможно дубликат [DataTable реструктуризации (Одна колонка Элементы для различных столбцов в DataTable)] (http://stackoverflow.com/questions/19226962/datatable-restructuring-one-column-items-to-different- column-in-datatable) –

ответ

-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; 
    } 
} 
+0

Спасибо Ahmed В этом решении количество строк, добавленных в NewDataTable, основано на rowCount, определяемом путем чтения длины первого сгруппированного столбца (int rowCount = grouped [0] .Count;). Это фактически ограничивает число полей, поступающих в последующие столбцы, то есть сгруппированные [0] TableName1 | ColumnName1 имеет 2 поля. Он добавит две строки, но что, если TableName2 | ColumnName2 имеет 10 полей. Только первые две записи будут добавляться, так как в NewDataTable существует только две строки. – Kash

+0

Я не недооценил и нисходящий, я помог, ответ не «не полезен» для того, чтобы заслужить ниспровержение. Я хотел ответить за меня, я просто хотел решить проблему. Просто случилось, что это был вопрос. @Kash Вы должны попробовать и адаптировать это решение к вашим потребностям. –

+0

Привет, Ахмед, я ничего не сделал. Я попробовал upVote, но мне нужно как минимум 15 репутации. – Kash

Смежные вопросы