[英]Transpose a datatable
我有下面的數據表。 我想更改數據表以將數據表轉換為旁邊的數據表。 我怎樣才能做到這一點?
我之所以要這樣做是因為excel文件將數據顯示為如圖所示,然后我想在第1行上對這些數據進行排序
當前表
|| Col 1 || Col 2 || Col 3
____________________________________
Row 1 || 10 || 20 || 30
Row 2 || 1 || 2 || 3
新數據表
|| Row 1 || Row 2
Col 1 || 10 || 1
Col 2 || 20 || 2
Col 3 || 30 || 3
.NET不包括轉置數據表的方法。 你必須自己做。 該網站提供了有關示例轉置方法的教程。 我將復制並粘貼以下代碼片段:
private DataTable Transpose(DataTable dt)
{
DataTable dtNew = new DataTable();
//adding columns
for(int i=0; i<=dt.Rows.Count; i++)
{
dtNew.Columns.Add(i.ToString());
}
//Changing Column Captions:
dtNew.Columns[0].ColumnName = " ";
for(int i=0; i<dt.Rows.Count; i++)
{
//For dateTime columns use like below
dtNew.Columns[i+1].ColumnName = Convert.ToDateTime(dt.Rows[i].ItemArray[0].ToString()).ToString("MM/dd/yyyy");
//Else just assign the ItermArry[0] to the columnName prooperty
}
//Adding Row Data
for(int k=1; k<dt.Columns.Count; k++)
{
DataRow r = dtNew.NewRow();
r[0] = dt.Columns[k].ToString();
for(int j=1; j<=dt.Rows.Count; j++)
r[j] = dt.Rows[j-1][k];
dtNew.Rows.Add(r);
}
return dtNew;
}
DataTable newDt = new DataTable();
//Select indexes
var indexes = dt.Rows.Cast<DataRow>().Select(row => dt.Rows.IndexOf(row));
//Select the columns
var newCols = indexes.Select(i => "Row" + i);
//Add columns
foreach(var newCol in newCols)
{
newDt.Add(newCol);
}
//Select rows
var newRows = dt.Rows.Cast<DataColumn>().Select(col =>
{
row = newDt.NewRow();
foreach(int i in indexes)
{
row[i] = dt.Rows[i][col.Name];
}
return row;
});
//Add row to new datatable
foreach(var row in newRows)
{
newDt.Add(row);
}
創建一個新表,其尺寸與以前的尺寸相反,然后將以前的列分配給新行,將舊的行分配給新列。
例如:
oldCol1 -> newRow1
oldCol2 -> newRow2
oldCol3 -> newRow3
oldCol4 -> newRow4
oldRow1 -> newCol1
oldCol2 -> newCol2
oldvar[a][b] -> newvar[b][a]
然后列表繼續,假設您來自
col1 || col2 || col3 || col4
row1 ||[a][b]||[c][d]||[e][f]
row2 ||[g][h]||[i][j]||[k][l]
至
row1 || col1 || col2
row2 ||[a][b]||[g][h]
row3 ||[c][d]||[i][j]
row4 ||[e][f]||[k][l]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.