C#中合并DataTable相同PersonId及日期的重复行至多列新表
合并DataTable中重复分组的行到新表
假设你的原DataTable包含PersonId、OrginalDate、ConvertedDate以及差异列(示例中暂命名为DiffColumn),以下是具体实现方案:
核心思路
- 按
PersonId、OrginalDate、ConvertedDate三个字段分组,提取每组内的差异列值集合 - 创建新DataTable:保留基础分组列,再根据所有分组中最多的差异值数量,动态添加对应数量的扩展列(如
Value1、Value2...) - 遍历每个分组,将基础信息和差异值填入新表的对应行,原表数据完全保留
代码实现(C#)
// 假设原DataTable已初始化并填充数据,示例结构参考: // DataTable originalTable = new DataTable(); // originalTable.Columns.Add("PersonId", typeof(int)); // originalTable.Columns.Add("OrginalDate", typeof(DateTime)); // originalTable.Columns.Add("ConvertedDate", typeof(DateTime)); // originalTable.Columns.Add("DiffColumn", typeof(string)); // 1. 按分组字段聚合,获取每组的差异值列表 var groupedData = originalTable.AsEnumerable() .GroupBy(row => new { PersonId = row.Field<int>("PersonId"), OrginalDate = row.Field<DateTime>("OrginalDate"), ConvertedDate = row.Field<DateTime>("ConvertedDate") }) .Select(g => new { GroupKey = g.Key, DiffValues = g.Select(row => row.Field<string>("DiffColumn")).ToList() }) .ToList(); // 2. 确定新表需要的最大扩展列数 int maxValueCount = groupedData.Max(g => g.DiffValues.Count); // 3. 构建新DataTable结构 DataTable mergedTable = new DataTable(); mergedTable.Columns.Add("PersonId", typeof(int)); mergedTable.Columns.Add("OrginalDate", typeof(DateTime)); mergedTable.Columns.Add("ConvertedDate", typeof(DateTime)); for (int i = 1; i <= maxValueCount; i++) { mergedTable.Columns.Add($"Value{i}", typeof(string)); } // 4. 填充新表数据 foreach (var group in groupedData) { DataRow newRow = mergedTable.NewRow(); newRow["PersonId"] = group.GroupKey.PersonId; newRow["OrginalDate"] = group.GroupKey.OrginalDate; newRow["ConvertedDate"] = group.GroupKey.ConvertedDate; for (int i = 0; i < group.DiffValues.Count; i++) { newRow[$"Value{i+1}"] = group.DiffValues[i]; } mergedTable.Rows.Add(newRow); }
补充说明
- 若差异列是数值、日期等其他类型,只需修改代码中对应的
typeof()类型即可 - 新表的扩展列会适配所有分组中最多的差异值数量,分组内差异值不足的列会留空
- 原DataTable的所有记录不会被修改或删除,完全保留原始数据
内容的提问来源于stack exchange,提问作者Sina
相关产品推荐
相关产品推荐

