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);
                }

            }

 

posted on 2017-04-08 18:05  奔游浪子  阅读(530)  评论(0)    收藏  举报

导航