You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C#项目中如何用DataTable.Select()实现分组求和并展示聚合记录?

用DataTable.Select()实现分组求和的解决方案

嘿,我懂你想要用DataTable.Select()来完成分组求和的需求了——虽然这个方法本身主要是用来筛选行的,但我们可以结合它来实现聚合操作,完全符合你的要求。下面是具体的实现思路和代码:

核心思路

我们需要先确定分组的依据(也就是Col1Col2的唯一组合),然后针对每个分组,用Select()筛选出对应的行,再手动累加Col3Col4的值,最后把结果整理成新的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

火山引擎 最新活动