public static void Main()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("name");
            dt.Columns.Add("type");
            dt.Columns.Add("relt");            for (int i = 0; i < 4; i++)
            {
                DataRow dr = dt.NewRow();
                dr["name"] = "name" + i;
                dr["type"] = "type" + i;
                dr["relt"] = "relt" + i;                dt.Rows.Add(dr);
            }            DisplayTable(dt);            Console.WriteLine("\r\n =====> 进行行列转换 \r\n");            DisplayTable(ColumnToRow(dt, 0));            Console.ReadLine();
        }        public static DataTable ColumnToRow(DataTable src_dt, int columnIndex) //columnIndex 用来当作新列名的列
        {
            DataTable dt = new DataTable();
            dt.Columns.Add(src_dt.Columns[columnIndex].ColumnName);            foreach (DataRow dr in src_dt.Rows)
                dt.Columns.Add(dr[columnIndex].ToString());            int n = src_dt.Columns.Count;
            for (int i = 0; i < n; i++)
            {
                if (i == columnIndex) continue; //如果是被当作列名的列,则跳过                DataRow new_dr = dt.NewRow();
                string columnName = src_dt.Columns[i].ColumnName;
                new_dr[0] = columnName;                foreach (DataRow dr in src_dt.Rows)
                {
                    string newColumnName = dr[columnIndex].ToString();
                    new_dr[newColumnName] = dr[columnName];
                }                dt.Rows.Add(new_dr);
            }            return dt;
        }打印的结果:name    type    relt
name0   type0   relt0
name1   type1   relt1
name2   type2   relt2
name3   type3   relt3=====> 进行行列转换name    name0   name1   name2   name3
type    type0   type1   type2   type3
relt    relt0   relt1   relt2   relt3跟大家分享,也期待大侠有更好的算法

解决方案 »

  1.   


    个人感觉还是有那么点用的 数据来源不一定是数据库来的.而且500W的数据 使用SQL转换为列,还真不知道怎么搞...
      

  2.   


    这个只是对拿到数据的二次加工,你非要取出500W的数据,我也没招PS:我不会这么干
      

  3.   

    如果数据500w了,Sql行转列,也够呛的。用任何东西都是有选择的,数据量小的话用用,数据量大的时候就不用了都是度的问题,没有必要在这争这个,
      

  4.   

    数据还是在数据库操作好些。
    毕竟不管多少数据从数据库取出后在程序中运行,程序都会给这些数据开辟一定的内存空间来执行。
    这样数据库的良好机制就浪费了。而且程序也会变慢。
    数据库更不会成为性能的瓶颈。
    如果真是这样的话,那微软早就采用XML或其它方式业存储数据。
    个人愚见,不对楼主的程序进行评论
      

  5.   


            public DataTable ReturnNewTB(DataTable dt)
            {            DataTable TB = new DataTable();
                TB.Columns.Add(dt.Columns[0].ToString());
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    TB.Columns.Add(dt.Rows[i][0].ToString());
                }            for (int i = 1; i < dt.Columns.Count; i++)
                {
                    DataRow dr = TB.NewRow();
                    for (int t = 1; t < TB.Columns.Count; t++)
                    {
                        string B = dt.Columns[i].ToString();
                        string C = dt.Rows[t - 1][i - 1].ToString();
                        dr[0] = B;
                        dr[t] = C;
                    }
                    TB.Rows.Add(dr);
                }
                return TB;
            }
      

  6.   

    -->>方法
            static DataTable ReturnNewTB(DataTable dt)
            {            DataTable TB = new DataTable();
                TB.Columns.Add(dt.Columns[0].ToString());
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    TB.Columns.Add(dt.Rows[i][0].ToString());
                }            for (int i = 0; i < dt.Columns.Count; i++)
                {
                    DataRow dr = TB.NewRow();
                    for (int j = 0; j < TB.Columns.Count - 1; j++)
                    {
                        dr[0] = dt.Columns[i].ToString();
                        dr[j + 1] = dt.Rows[j][i].ToString();
                    }
                    TB.Rows.Add(dr);
                }
                return TB;
            }-->>测试            DataTable dt = new DataTable();
                dt.Columns.Add("name");
                dt.Columns.Add("type");
                dt.Columns.Add("relt");
                dt.Columns.Add("pppp");            for (int i = 0; i < 6; i++)
                {
                    DataRow dr = dt.NewRow();
                    dr["name"] = "name" + i;
                    dr["type"] = "type" + i;
                    dr["relt"] = "relt" + i;
                    dr["pppp"] = "pppp" + i;                dt.Rows.Add(dr);
                }            for (int i = 0; i < dt.Rows.Count; i++)
                {
                    string _col = "";
                    for (int j = 0; j < dt.Columns.Count;j++ )
                    {
                        _col += dt.Rows[i][j].ToString() + "    ";
                    }
                    Console.WriteLine(_col);
                    Console.Write("");
                }
                Console.WriteLine("\r\n"+"-->>>C#行转列"+"\r\n");
                DataTable NewTB = ReturnNewTB(dt);
                for (int i = 0; i < NewTB.Rows.Count; i++)
                {
                    string _str = "";
                    for (int a = 0; a < NewTB.Columns.Count; a++)
                    {
                        _str += NewTB.Rows[i][a].ToString() + "    ";
                    }
                    Console.WriteLine(_str);
                    Console.Write("");
                }-->>结果
    name0    type0    relt0    pppp0
    name1    type1    relt1    pppp1
    name2    type2    relt2    pppp2
    name3    type3    relt3    pppp3
    name4    type4    relt4    pppp4
    name5    type5    relt5    pppp5-->>>C#行转列
    name    name0    name1    name2    name3    name4    name5
    type    type0    type1    type2    type3    type4    type5
    relt    relt0    relt1    relt2    relt3    relt4    relt5
    pppp    pppp0    pppp1    pppp2    pppp3    pppp4    pppp5
      

  7.   

    简单的数据转换,不错。
            public DataTable GetReverseTable(DataTable d) 
            { 
                DataTable dt= new DataTable(); 
                for (int i = 0; i< d.Rows.Count + 1; i++) 
                { 
                    dt.Columns.Add("Column"+i.ToString()); 
                } 
                for (int i = 0; i< d.Columns.Count; i++) 
                { 
                    object[] _ObjectValue = new object[d.Rows.Count + 1]; 
                    _ObjectValue[0] = d.Columns[i].ColumnName; 
                    for(int j = 0; j<d.Rows.Count; j++) 
                    { 
                        _ObjectValue[j + 1] =d.Rows[j][i];                    
                    } 
                    dt.Rows.Add(_ObjectValue); 
                } 
                return dt; 
            }
      

  8.   

    个人觉得如果http服务器压力很大的话,这些工作还是留给数据库服务器来完成。
    如果浏览不大,那谁来做影响都不大。
      

  9.   

    恩,不错,以前都是sql里解决的。接分占位
      

  10.   

    不晓得你的用途是干嘛的
    矩阵转换一般都用得较少,何况是DataTable的数据
    我猜测你的数据结构的设计可能有问题,一般在设计的时候都要尽量避免这种大矩阵的处理
    ps.最好用object[,]来代替DataTable,性能会好一点
    个人建议还是在系统设计的时候尽量考虑周到一点
      

  11.   

    还有个高性能的方案
    用unsafe代码,指针来做
      

  12.   

    这个东西不具有通用性,有意义吗?另外弱弱的问句,楼主您用的是ACCESS吧?
      

  13.   

    参考 sqlserver 交叉表 的写法。
      

  14.   


    交叉表还真没弄过,一会查下资料,TKS
      

  15.   


    我也同意在數據庫裡做轉換,但一起沒有實現,大家能不能給倏SQL參考一下