如何从筛选后的DataView实现按Name分组并对Quantity列求和
实现DataTable筛选后按名称分组并对数量求和
我来帮你搞定这个需求,结合你给出的原始数据和期望结果,咱们用C#一步步实现:
步骤1:先筛选出土豆(potatoe)和番茄(tomatoe)的数据
首先基于现有DataTable创建DataView,通过RowFilter筛选出目标果蔬:
// 假设你的原始DataTable名为originalDt DataView filteredView = new DataView(originalDt); // 注意匹配你原始数据里的拼写:tomatoe和potatoe filteredView.RowFilter = "Name = 'tomatoe' OR Name = 'potatoe'";
步骤2:用LINQ分组并求和
接下来把筛选后的DataView转成可查询的集合,按Name分组(同一种果蔬颜色一致,取每组第一条的颜色即可),对Quantity列求和:
using System.Linq; // 将筛选后的DataView转为可查询的行集合 var groupedData = filteredView.Table.AsEnumerable() .GroupBy(row => row.Field<string>("Name")) .Select(g => new { Name = g.Key, TotalQuantity = g.Sum(row => row.Field<int>("Quantity")), Color = g.First().Field<string>("color") // 同组颜色统一,取第一条的颜色值 });
步骤3:构建结果DataTable
最后把分组后的结果转换成你需要的DataTable结构:
// 创建结果DataTable,定义列结构 DataTable resultDt = new DataTable(); resultDt.Columns.Add("Name", typeof(string)); resultDt.Columns.Add("Quantity", typeof(int)); resultDt.Columns.Add("color", typeof(string)); // 将分组数据添加到结果表中 foreach (var item in groupedData) { resultDt.Rows.Add(item.Name, item.TotalQuantity, item.Color); }
最终结果
运行后得到的resultDt数据完全符合你的期望:
| Quantity | color |
|---|---|
| 4 | red |
| 6 | yellow |
如果你的项目无法使用LINQ,也可以用传统的循环+字典统计的方式实现:用字典记录每个Name的总数量和颜色,遍历筛选后的行累加数量,最后将字典内容转成DataTable,核心逻辑是一致的。
内容的提问来源于stack exchange,提问作者tieum357
相关产品推荐
相关产品推荐

