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
相关产品推荐
相关产品推荐

