如何在VB.NET中对DataTable指定数据求和并保存至新表
在VB.NET中对DataTable按日期分组并筛选特定Type求和
嗨,这个需求用LINQ to DataSet就能轻松解决,代码简洁还容易维护。我给你一步步拆解实现过程:
步骤1:准备目标Type列表
先把需要求和的Type列值存到一个列表里,后续要修改的话直接改这个列表就行,不用到处找代码:
Dim targetTypes As New List(Of String) From {"value80", "value71", "value63"}
步骤2:用LINQ完成分组求和
假设你的原始DataTable名叫originalDt,我们先筛选出符合Type条件的行,再按日期分组,最后计算每组的Value总和:
' 从原始DataTable中筛选并分组求和 Dim groupedResult = From row In originalDt.AsEnumerable() ' 只保留Type在目标列表中的行 Where targetTypes.Contains(row.Field(Of String)("type")) ' 按Date列分组,dateKey是分组的键值 Group row By dateKey = row.Field(Of Date)("Date") Into Group ' 生成包含日期和求和结果的匿名对象 Select New With { .GroupDate = dateKey, .TotalValue = Group.Sum(Function(r) r.Field(Of Decimal)("value")) }
注意:这里的
value列类型我用了Decimal,如果你的原始数据是整数(Integer)或者其他数值类型,记得对应修改,比如r.Field(Of Integer)("value")。如果value列可能存在空值,建议用可空类型处理:r.Field(Of Decimal?)("value").GetValueOrDefault(0),避免空值引发异常。
步骤3:将结果存入新的DataTable
接下来我们创建一个新的DataTable来存储最终结果,并把LINQ的查询结果填充进去:
' 创建结果DataTable,定义列结构 Dim resultDt As New DataTable() resultDt.Columns.Add("Date", GetType(Date)) resultDt.Columns.Add("value_sum", GetType(Decimal)) ' 类型要和上面的TotalValue一致 ' 遍历LINQ结果,逐行添加到新DataTable For Each item In groupedResult resultDt.Rows.Add(item.GroupDate, item.TotalValue) Next
最后一步:使用结果
现在resultDt就是你想要的最终数据啦,你可以直接把它绑定到DataGridView展示,或者保存到数据库/文件里:
' 绑定到DataGridView的示例 DataGridView1.DataSource = resultDt
如果你的Date列在原始DataTable里是字符串类型,记得在分组的时候先转换成Date类型,比如:
Group row By dateKey = Date.Parse(row.Field(Of String)("Date")) Into Group
不过更建议在导入数据的时候就把Date列设置为Date类型,避免日期格式不匹配的问题。
内容的提问来源于stack exchange,提问作者jonas
相关产品推荐
相关产品推荐

