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

如何按列合并数据表重复行并生成新表?及LINQ分组统计问题

嘿,我来帮你搞定这两个DataTable处理的问题!先从你提到的按cfg列分组统计数量说起,再讲按指定列合并重复行的实现~

一、按cfg列分组统计数量并生成新数据表

你写的LINQ分组逻辑已经很接近了,核心是先按cfg列分组,统计每组的行数,最后把结果转换成新的DataTable就行。这里需要注意匿名类型不能直接用CopyToDataTable(),所以我们手动创建表结构再填充数据:

// 获取原始数据表
DataTable objDataTable = DLService.GetData();

// 按cfg列分组并统计数量,同时按cfg值排序
var groupedResults = from row in objDataTable.AsEnumerable()
                     group row by row.Field<string>("cfg") into cfgGroup
                     orderby cfgGroup.Key
                     select new 
                     {
                         Cfg = cfgGroup.Key,
                         Count = cfgGroup.Count()
                     };

// 创建用于存储结果的新数据表
DataTable countResultTable = new DataTable("CfgCountStatistics");
countResultTable.Columns.Add("cfg", typeof(string));
countResultTable.Columns.Add("count", typeof(int));

// 将分组统计结果填入新表
foreach (var result in groupedResults)
{
    countResultTable.Rows.Add(result.Cfg, result.Count);
}

这段代码里,我们先通过LINQ完成分组和统计,然后定义结果表的列结构,最后遍历分组结果把数据逐行添加进去,这样就得到你要的统计数据表了。

二、按指定列合并重复行并存入新表

合并重复行的关键是明确重复行的合并规则:比如指定列是cfg,其他列是数值类型要求和?还是文本类型要拼接?或者只保留重复行中的第一行?我给你两种常见场景的实现:

场景1:自定义合并规则(比如数值求和、文本拼接)

假设你的数据表有cfg、amount(数值型)、remark(文本型)列,要按cfg合并,amount求和,remark拼接所有不同的内容:

// 按cfg分组,自定义合并逻辑
var mergedGroups = from row in objDataTable.AsEnumerable()
                   group row by row.Field<string>("cfg") into cfgGroup
                   select new
                   {
                       Cfg = cfgGroup.Key,
                       TotalAmount = cfgGroup.Sum(r => r.Field<int>("amount")),
                       CombinedRemarks = string.Join("; ", cfgGroup.Select(r => r.Field<string>("remark")).Distinct())
                   };

// 创建合并后的新表
DataTable mergedResultTable = new DataTable("MergedData");
mergedResultTable.Columns.Add("cfg", typeof(string));
mergedResultTable.Columns.Add("total_amount", typeof(int));
mergedResultTable.Columns.Add("combined_remarks", typeof(string));

// 填充合并后的数据
foreach (var group in mergedGroups)
{
    mergedResultTable.Rows.Add(group.Cfg, group.TotalAmount, group.CombinedRemarks);
}

场景2:简单去重(保留重复行的第一行)

如果你的需求只是去掉指定列的重复行,保留每组的第一行,可以用DistinctBy(需要.NET Core 3.0+,或者引入System.Linq.Dynamic.Core包):

// 按cfg列去重,保留每个cfg对应的第一行
DataTable distinctTable = objDataTable.AsEnumerable()
                                      .DistinctBy(row => row.Field<string>("cfg"))
                                      .CopyToDataTable();

这个方法更简洁,适合只需要去重不需要合并其他列内容的场景。


内容的提问来源于stack exchange,提问作者ace

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:23:31