首页 > 解决方案 > 数据表上的 LINQ 对多列求和 vb.net

问题描述

有谁知道是否可以根据另一列的给定标准对数据表或数据网格视图的多个列进行求和?简而言之,我有一个看起来(简单)像这样的表:

Ph Length  Start
A     10     1.5
B     14     2
C     9      1.8
A     11     1.4

等等....

我想要做的是了解,是否可以使用 LINQ 基于“Ph”对一个查询中的长度和开始列进行求和?还是我需要为每封信写一个?

本质上,结果需要是 A = 21, 2.9。B = 14, 2. C = 9, 1.8

我被难住了,老实说,我不知道该怎么做。我什至不介意是否有人可以为我指出一个非常好的资源来更好地学习 LINQ。

标签: vb.netlinqdatagridviewdatatablesum

解决方案


要根据键列值组合 LINQ 中的行,请使用GroupBy.

一旦有了行组,就可以对感兴趣的列求和。

在 LINQ 查询理解语法中,

Dim sums = From dr In dt.AsEnumerable()
           Group dr By Ph = dr.Field(Of String)("Ph") Into drg = Group
           Select New With {
               .Ph = Ph,
               .LengthSum = drg.Sum(Function(dr) dr.Field(Of int)("Length")),
               .StartSum = drg.Sum(Function(dr) dr.Field(Of Double)("Start"))
           }

如果您更喜欢 lambda 语法,

Dim sums2 = dt.AsEnumerable() _
              .GroupBy(Function(dr) dr.Field(Of String)("Ph")) _
              .Select(Function(drg) New With {
                  .Ph = drg.Key,
                  .LengthSum = drg.Sum(Function(dr) dr.Field(Of Integer)("Length")),
                  .StartSum = drg.Sum(Function(dr) dr.Field(Of Double)("Start"))
              })

在这两种情况下,查询的结果都是IEnumerable我在select/中创建的匿名对象Select。您可以创建一个类,或者通过一些额外的工作,创建一个新DataTable的来保存答案,或者使用现有DataTable.


推荐阅读