You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 04:16:04