DataTable的行列 转换
DataTable在页面上就是一个二维数组, 或者说是一个矩阵,还记得刚上大一的时候,线性代数里就是把行列式(矩阵)进行行变列,列变行的切换,今天用代码试了一把,这感觉,那叫一个酸爽。
在DataTable里,一定 要注意的是他和矩阵的区别就是,DataTable有列名,所以在进行行列转换的时候要注意了,分2种情况,
1、只转换数据,列名并不参与。
a b c d
1 2 3 4
5 6 7 8
变成
1 5
2 6
3 7
4 8
代码若下:我觉得很不好理解,但是拿笔画画图就好了,一下子就解决了。
DataTable newDt = new DataTable(); if (dt != null && dt.Rows.Count > 0) { for (int i = 0; i < dt.Rows.Count; i++) { //newDt.Columns.Add(dt.Rows[i][0].ToString()); newDt.Columns.Add("第" + i + "列"); } for (int i = 0; i < dt.Columns.Count; i++) { DataRow dr = newDt.NewRow(); for (int j = 0; j < dt.Rows.Count; j++) { dr[j] = dt.Rows[j][i]; } newDt.Rows.Add(dr); } } return newDt;
但是要注意哈,这也就是和第二种方式代表头的那种的最大的区别,这种写法是把所有的数据都转换了,和表头没关系,数据想显示几条就是几条
DataTable newDt = new DataTable(); if (dt != null && dt.Rows.Count > 0) { for (int i = 0; i < dt.Rows.Count; i++) { //newDt.Columns.Add(dt.Rows[i][0].ToString()); newDt.Columns.Add("第" + i + "列"); } for (int i = 0; i < dt.Columns.Count-1; i++) { DataRow dr = newDt.NewRow(); 这句好巧妙,有多少列就是现在的多少行 for (int j = 0; j < dt.Rows.Count; j++) { dr[j] = dt.Rows[j][i+1]; } newDt.Rows.Add(dr); } } return newDt;
结果变成 当然不考虑我在里面自定义添加的额外的表头哈,
2 6
3 7
4 8
2、原来的列名也跟着换,列名和数据一起,行列转换。
因为这次表头也跟着一起切换了,所以要小心,因为表头参与进来了,所以必须原来的第二列是现在的第一行数据,
DataTable newDt = new DataTable(); if (dt != null && dt.Rows.Count > 0) { string first = dt.Columns[0].ToString(); 必须要单独定义下,不然2个DataTable里分不清哪个列 newDt.Columns.Add(first); for (int i = 0; i < dt.Rows.Count; i++) { newDt.Columns.Add(dt.Rows[i][0].ToString()); } for (int i = 0; i < dt.Columns.Count - 1; i++) { DataRow dr = newDt.NewRow(); dr[0] = dt.Columns[i + 1]; for (int j = 0; j < dt.Rows.Count; j++) { dr[j + 1] = dt.Rows[j][i + 1]; } newDt.Rows.Add(dr); } }
浙公网安备 33010602011771号