【问题标题】:LINQ on datatable to sum multiple columns vb.net数据表上的 LINQ 对多列求和 vb.net
【发布时间】:2018-06-11 22:16:39
【问题描述】:

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

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。

【问题讨论】:

  • 如果您尝试自己回答问题并展示您的所作所为/失败之处,人们会更愿意回答您的问题。一般来说,对于这个问题,您需要对其他 2 列进行 GroupBy Ph 和 Sum。

标签: vb.net linq datagridview datatable sum


【解决方案1】:

要在 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"))
              })

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

【讨论】:

    猜你喜欢
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多