如何按列合并数据表重复行并生成新表?及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
相关产品推荐
相关产品推荐

