DataTable扩展 列转行方法(2*2矩阵转换)

源数据 如图所示

复制代码
// <summary>
        /// DataTable扩展 列转行方法(2*2矩阵转换)
        /// </summary>
        /// <param name="dtSource">数据源</param>
        /// <param name="columnFilter">逗号分隔 如SDateTime,PM25,PM10,O3,NO2,SO2,CO 第一个参数为行,其余为要转换的列</param>
        /// <returns></returns>
        public static DataTable PivotDatatableColToRow(this DataTable dtSource, string columnFilter)
        {
            var columns = columnFilter.Split(',');
            DataTable dtFilter = dtSource.DefaultView.ToTable(false, columns);
            DataTable dtResult = new DataTable();

            var rowCount = dtFilter.Rows.Count;
            var columnCount = columns.Length;

            // 源数组的行数比DataTable的行数+1,, 加一行表头
            object[,] arrSource = new object[rowCount + 1, columnCount];

            // 目标数组的行数等于选择的列数,列数等于 源数据的行数+1, 加一列 属性名
            object[,] arrResult = new object[columnCount, rowCount + 1];

            // 原数组第一行写表头
            for (int i = 0; i < columnCount; i++)
            {
                arrSource[0, i] = dtFilter.Columns[i].ColumnName;
            }

            // 源数据 每一行写 数据
            for (int i = 0; i < rowCount; i++)
            {
                for (int j = 0; j < columnCount; j++)
                {
                    arrSource[i + 1, j] = dtFilter.Rows[i][j];
                }
            }

            // 原数 转置到 目标数组
            for (int i = 0; i < rowCount + 1; i++)
            {
                for (int j = 0; j < columnCount; j++)
                {
                    arrResult[j, i] = arrSource[i, j];
                }
            }

            // 创建 Datatable 的结构
            for (int i = 0; i < rowCount + 1; i++)
            {
                if (!dtResult.Columns.Contains(arrResult[0, i].ToString())) {
                    dtResult.Columns.Add(arrResult[0, i].ToString());
                }
            }

            List<string> valueList = new List<string>();
            for (int i = 1; i < columnCount; i++)
            {
                for (int j = 0; j < rowCount + 1; j++)
                {
                    valueList.Add(arrResult[i, j].ToString());
                }

                dtResult.Rows.Add(valueList.ToArray());
                valueList.Clear();
            }
            return dtResult;
        }

转换后的数据

DataTable newdt = dt.AsEnumerable().Where(p => p.Field<string>("City") == "武汉").CopyToDataTable().PivotDatatableColToRow("SDateTime,PM25,PM10,O3,NO2,SO2,CO");

相关推荐
人工智能AI技术37 分钟前
【C#程序员入门AI】本地大模型落地:用Ollama+C#在本地运行Llama 3/Phi-3,无需云端
人工智能·c#
MyBFuture5 小时前
C#数组详解:一维二维与交错数组
开发语言·windows·c#·visual studio·vision pro
有来技术6 小时前
ASP.NET Core 权限管理系统(RBAC)设计与实现|vue3-element-admin .NET 后端
vue.js·后端·c#·asp.net·.net
张人玉7 小时前
C#WinFrom中show和ShowDialog的区别
开发语言·microsoft·c#
m0_748233177 小时前
C#:微软的现代编程利器
开发语言·microsoft·c#
Traced back7 小时前
SQL Server数据自动清理系统最终版(C# WinForms完整源码)
数据库·c#·.net
人工智能AI技术8 小时前
【C#程序员入门AI】Microsoft Extensions for AI (MEAI):统一LLM调用接口,告别厂商绑定
人工智能·c#
William_cl9 小时前
C# ASP.NET路由系统全解析:传统路由 vs 属性路由,避坑 + 实战一网打尽
开发语言·c#·asp.net
初九之潜龙勿用1 天前
C# 操作Word模拟解析HTML标记之背景色
开发语言·c#·word·.net·office
时光追逐者1 天前
使用 MWGA 帮助 7 万行 Winforms 程序快速迁移到 WEB 前端
前端·c#·.net