C#使用DataTable实现数据行列转置的方法

Hazel
Hazel
发布时间:2026-10-16 | 7人浏览过
原创

在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#数据处理技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表