C#项目中如何用DataTable.Select()实现分组求和并展示聚合记录?
用DataTable.Select()实现分组求和的解决方案
嘿,我懂你想要用DataTable.Select()来完成分组求和的需求了——虽然这个方法本身主要是用来筛选行的,但我们可以结合它来实现聚合操作,完全符合你的要求。下面是具体的实现思路和代码:
核心思路
我们需要先确定分组的依据(也就是Col1和Col2的唯一组合),然后针对每个分组,用Select()筛选出对应的行,再手动累加Col3和Col4的值,最后把结果整理成新的DataTable。
完整代码示例
首先先模拟你的原始DataTable(方便测试):
// 初始化原始DataTable DataTable originalTable = new DataTable(); originalTable.Columns.Add("Col1", typeof(string)); originalTable.Columns.Add("Col2", typeof(string)); originalTable.Columns.Add("Col3", typeof(int)); originalTable.Columns.Add("Col4", typeof(int)); // 添加你提供的测试数据 originalTable.Rows.Add("A", "X", 10, 10); originalTable.Rows.Add("A", "X", 10, 20); originalTable.Rows.Add("A", "Y", 12, 12); originalTable.Rows.Add("A", "Y", 10, 10);
接下来是分组求和的核心逻辑:
// 1. 获取Col1和Col2的所有唯一组合(分组依据) var uniqueGroups = originalTable.AsEnumerable() .Select(row => new { Col1 = row["Col1"].ToString(), Col2 = row["Col2"].ToString() }) .Distinct(); // 2. 创建结果DataTable,和原表结构保持一致 DataTable resultTable = originalTable.Clone(); // 3. 遍历每个分组,用Select筛选行并计算总和 foreach (var group in uniqueGroups) { // 处理特殊字符:如果Col1/Col2包含单引号,需要转义为两个单引号 string escapedCol1 = group.Col1.Replace("'", "''"); string escapedCol2 = group.Col2.Replace("'", "''"); // 构建筛选条件,匹配当前分组的Col1和Col2 string filter = $"Col1 = '{escapedCol1}' AND Col2 = '{escapedCol2}'"; DataRow[] groupRows = originalTable.Select(filter); // 累加Col3和Col4的值 int sumCol3 = 0; int sumCol4 = 0; foreach (DataRow row in groupRows) { sumCol3 += Convert.ToInt32(row["Col3"]); sumCol4 += Convert.ToInt32(row["Col4"]); } // 将求和结果添加到结果表中 resultTable.Rows.Add(group.Col1, group.Col2, sumCol3, sumCol4); }
关键说明
- 我们用
AsEnumerable()和Distinct()来提取唯一的分组组合,这一步需要引用System.Linq命名空间; - 筛选条件里的单引号转义很重要,如果你的数据里包含单引号,不转义会导致筛选失败;
- 最终的
resultTable就是你想要的聚合后的结果,结构和原表一致,每行对应一个分组的求和值。
内容的提问来源于stack exchange,提问作者Ashish Jaiswal




