C#使用DataTable实现数据行列转置的方法
在C#开发中,经常需要将二维表格数据的行列进行互换(转置),例如将原本以行为单位的记录转换为以列为单位的展示形式。由于.NET Framework中的System.Data.DataTable没有直接提供转置方法,需要手动编写逻辑来处理列名的生成和单元格数据的重新映射。
核心实现逻辑
实现DataTable行列转换的关键在于创建一个新的DataTable对象,其列结构由原表的行数决定,而新表中的每一行则由原表的某一列数据填充。同时,为了保持数据的可追溯性,通常会在结果表的左侧增加一列用于存储原表的列名称。
第1步:初始化新DataTable结构
首先创建一个空DataTable,并添加一个固定名称的字段(如COLUMN_NAME)用于存放原表的列头信息。接着,根据原表的行数确定新表的列数。在示例中,新表的剩余列被动态命名为VLAUE_1、VLAUE_2等序列号,类型统一设置为字符串typeof(string),以确保所有数据都能顺利存入而不发生类型冲突。
public static DataTable RevertRowToColumn(DataTable sourcedt)
{
DataTable dt = new DataTable();
// 新增一列用于存放原表列名
dt.Columns.Add("COLUMN_NAME", typeof(string));
string[] aa = new string[sourcedt.Rows.Count];
// 为每行生成对应的列名
for (int i = 0; i < sourcedt.Rows.Count; i++)
{
aa[i] = "VLAUE_" + (i + 1);
}
// 将生成的列名添加到新表中
for (int i = 0; i < aa.Length; i++)
{
dt.Columns.Add(aa[i].ToString(), typeof(string));
}
// ... 后续代码见下文 ...
第2步:遍历原表列并填充数据
获取原表sourcedt的所有列。对于原表的每一列,在新表中创建一行数据。将原表的当前列名赋值给新行的第一列(COLUMN_NAME),然后遍历该列的每一行数据,将其填入新表对应位置的单元格中。
// 遍历原表的每一列
for (int j = 0; j < sourcedt.Columns.Count; j++)
{
DataRow dr = dt.NewRow();
string column_name = sourcedt.Columns[j].ColumnName;
dr["COLUMN_NAME"] = column_name;
// 遍历原表该列的各行数据
for (int i = 0; i < sourcedt.Rows.Count; i++)
{
string cell_value = sourcedt.Rows[i][column_name].ToString();
// 将值填入新表的新增列中(索引+1是为了避开COLUMN_NAME列)
dr[i + 1] = cell_value;
}
dt.Rows.Add(dr);
}
return dt;
}
效果展示
经过上述代码处理后,DataTable的结构将发生显著变化。原始的行数据结构将被“翻转”为列数据结构。观察对比如下:
转置前(示例结构):
转置后(示例结构):
注意事项
- 数据类型限制:本示例中为了通用性,将所有转换后的单元格值强制转换为字符串类型(
.ToString())。如果原数据包含复杂对象,需确保对象具有正确的ToString()重写实现,或针对特定类型提取属性值。 - 性能考虑:当DataTable规模极大时,频繁创建Row对象可能影响性能。在生产环境处理大量数据时,建议预先分配容量或使用更高效的数据结构。
- 列名冲突:示例中使用固定的命名规则生成新列名。如果业务场景中原表有特定语义要求,可在此处修改
aa[i]的赋值逻辑以符合实际需求。
以上就是C#实现DataTable行列转换的详细内容,更多关于C#数据处理技巧的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









