如何在C# DataTable中对相同价格行的Size值求和并新增行展示
在C#中使用DataTable实现同价行Size求和并插入汇总行
实现思路
- 按
Price字段分组,计算每组对应的Size总和 - 遍历原数据,在每组数据的开头插入汇总行,展示对应价格的Size求和结果
- 生成包含汇总行的新DataTable,保留原表结构与数据
完整代码示例
using System; using System.Data; using System.Linq; class Program { static void Main() { // 构造测试DataTable(可替换为你的业务数据) DataTable originalTable = new DataTable(); originalTable.Columns.Add("Price", typeof(decimal)); originalTable.Columns.Add("Size", typeof(int)); originalTable.Columns.Add("OtherField", typeof(string)); // 示例其他业务字段 // 添加测试数据 originalTable.Rows.Add(10.5m, 2, "Item1"); originalTable.Rows.Add(10.5m, 3, "Item2"); originalTable.Rows.Add(20.0m, 5, "Item3"); originalTable.Rows.Add(20.0m, 4, "Item4"); originalTable.Rows.Add(15.8m, 1, "Item5"); // 按Price分组,计算每组Size总和 var priceSumDict = originalTable.AsEnumerable() .GroupBy(row => row.Field<decimal>("Price")) .ToDictionary(group => group.Key, group => group.Sum(row => row.Field<int>("Size"))); // 克隆原表结构,创建结果表 DataTable resultTable = originalTable.Clone(); // 遍历分组,先插入汇总行,再插入对应价格的原始行 foreach (var group in priceSumDict.OrderBy(g => g.Key)) // 按Price排序,按需开启 { // 创建并添加汇总行 DataRow sumRow = resultTable.NewRow(); sumRow["Price"] = group.Key; sumRow["Size"] = group.Value; sumRow["OtherField"] = "汇总"; // 标识汇总行的字段值 resultTable.Rows.Add(sumRow); // 添加当前价格下的所有原始行 var targetRows = originalTable.AsEnumerable() .Where(row => row.Field<decimal>("Price") == group.Key); foreach (var row in targetRows) { resultTable.Rows.Add(row.ItemArray); } } // 验证输出(可替换为业务逻辑处理) foreach (DataRow row in resultTable.Rows) { Console.WriteLine($"Price: {row["Price"]}, Size: {row["Size"]}, Field: {row["OtherField"]}"); } } }
关键说明
- 分组计算:借助LINQ的
GroupBy和Sum方法快速完成同价行的Size求和,避免手动遍历统计 - 结构复用:通过
Clone()方法复制原表结构,无需手动定义列,适配原表的字段变化 - 行顺序控制:先插入汇总行再插入原始行,确保汇总行显示在对应价格行的上方;若需要按价格排序,保留
OrderBy即可
内容的提问来源于stack exchange,提问作者Marc Jone
相关产品推荐
相关产品推荐

