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

C#中按列分组DataTable并对指定列求和的实现方法

C# DataTable 分组求和实现方案

没问题,我来给你两个简单的实现方案,完全满足你的需求——按product字段分组,计算productAmount的总和,效率方面你既然不考虑,那咱们优先选直观好理解的写法:

方法一:使用LINQ实现(最直观)

这种写法代码简洁,逻辑清晰,很容易看懂:

using System.Data;
using System.Linq;

public DataTable GetProductAmountSum(DataTable originalTable)
{
    // 通过LINQ对原表分组并计算总和
    var groupedResults = originalTable.AsEnumerable()
        .GroupBy(row => row.Field<string>("product"))
        .Select(group => new 
        {
            ProductName = group.Key,
            TotalAmount = group.Sum(row => row.Field<int>("productAmount"))
        });

    // 创建用于返回的结果DataTable
    DataTable resultTable = new DataTable();
    resultTable.Columns.Add("name", typeof(string));
    resultTable.Columns.Add("total", typeof(int));

    // 将分组结果填充到新表中
    foreach (var item in groupedResults)
    {
        resultTable.Rows.Add(item.ProductName, item.TotalAmount);
    }

    return resultTable;
}

代码说明:

  • originalTable.AsEnumerable():把DataTable转换为支持LINQ查询的集合
  • GroupBy(row => row.Field<string>("product")):按照product字段的值进行分组
  • Sum(row => row.Field<int>("productAmount")):计算每组中productAmount字段的总和
  • 最后创建新的DataTable并填充结果,结构完全符合你需要的name | total格式

方法二:传统循环+字典实现(无需LINQ)

如果你更习惯用传统的循环写法,也可以用字典临时存储每个产品的累计总和:

using System.Data;
using System.Collections.Generic;

public DataTable GetProductAmountSumWithoutLinq(DataTable originalTable)
{
    DataTable resultTable = new DataTable();
    resultTable.Columns.Add("name", typeof(string));
    resultTable.Columns.Add("total", typeof(int));

    // 用字典暂存每个产品的累计金额
    Dictionary<string, int> productSumDict = new Dictionary<string, int>();

    foreach (DataRow row in originalTable.Rows)
    {
        string productName = row.Field<string>("product");
        int currentAmount = row.Field<int>("productAmount");

        if (productSumDict.ContainsKey(productName))
        {
            // 产品已存在,累加金额
            productSumDict[productName] += currentAmount;
        }
        else
        {
            // 产品首次出现,初始化金额
            productSumDict.Add(productName, currentAmount);
        }
    }

    // 将字典中的数据转存到结果表
    foreach (var kvp in productSumDict)
    {
        resultTable.Rows.Add(kvp.Key, kvp.Value);
    }

    return resultTable;
}

使用示例

不管用哪种方法,你从DataSet获取原表后直接调用即可:

// 从DataSet的GetData方法获取原DataTable
DataSet yourDataSet = YourDataSetClass.GetData();
DataTable originalTable = yourDataSet.Tables[0];

// 调用方法得到分组求和后的表
DataTable summedTable = GetProductAmountSum(originalTable);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:44:34