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跟大家分享,也期待大侠有更好的算法
{
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跟大家分享,也期待大侠有更好的算法
解决方案 »
- 新手求教,关于类库变文件夹的问题。
- DropDownList控件如何实现即可以手工输入数据也可以选择里面的选项???
- 我给DataView绑定数据的时候,那个列名怎么显示不出来啊?
- gridview参数Querystring取不到值
- 如何将一个word文档对象,显示在Web页面中
- 项目转包,给个报价,本人公司接的单子,做不下来。最好是陕西的高手!!
- 控件不定的情况怎么做数据收集插入呢???
- 请教问题。
- SqlDataReader为啥读取的数据少很多,但用SqlDataAdapter读取是对
- 怎样取出Session.add("user", TextBox1.Text) 的值?
- 甘特图是怎么实现的?
- $("[id^='span']") 是什么意思??jquery中
个人感觉还是有那么点用的 数据来源不一定是数据库来的.而且500W的数据 使用SQL转换为列,还真不知道怎么搞...
这个只是对拿到数据的二次加工,你非要取出500W的数据,我也没招PS:我不会这么干
。
毕竟不管多少数据从数据库取出后在程序中运行,程序都会给这些数据开辟一定的内存空间来执行。
这样数据库的良好机制就浪费了。而且程序也会变慢。
数据库更不会成为性能的瓶颈。
如果真是这样的话,那微软早就采用XML或其它方式业存储数据。
个人愚见,不对楼主的程序进行评论
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;
}
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
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;
}
如果浏览不大,那谁来做影响都不大。
矩阵转换一般都用得较少,何况是DataTable的数据
我猜测你的数据结构的设计可能有问题,一般在设计的时候都要尽量避免这种大矩阵的处理
ps.最好用object[,]来代替DataTable,性能会好一点
个人建议还是在系统设计的时候尽量考虑周到一点
用unsafe代码,指针来做
交叉表还真没弄过,一会查下资料,TKS
我也同意在數據庫裡做轉換,但一起沒有實現,大家能不能給倏SQL參考一下