数据表或数据视图中的分组和求和

问题描述 投票:0回答:2

我有一个数据表(由 xls 文件填充),其中包含不同种类的水果和豆类。

我从这个数据表中创建了一个数据视图,并使用 RowFilter 仅包含土豆和西红柿。

现在,我尝试进行分组(使用“名称”列)并从另一列“数量”中求和。

其实:

Name    |  Quantity  | color
tomatoe |     2      |  red
tomatoe |     1      |  red
potatoe |     5      |  yellow
tomatoe |     1      |  red
potatoe |     1      |  yellow

我会返回这样的数据表或数据视图:

Name    |  Quantity | color
tomatoe |     4     |  red
potatoe |     6     |  yellow

我该怎么做?

抱歉,如果这很简单,但我对此很菜鸟。

vb.net datatable grouping dataview
2个回答
5
投票

使用

LINQ
,在本例中
Linq-To-DataTable

Dim fruitGroups = table.AsEnumerable().GroupBy(Function(row) row.Field(Of String)("Name"))

现在您可以创建结果表了:

Dim tableResult = table.Clone() ' empty table with same columns
For Each grp In fruitGroups 
    tableResult.Rows.Add(grp.Key, grp.Sum(Function(row) row.Field(Of Int32)("Quantity")), grp.First().Field(Of String)("Color"))
Next

这将采用每组(第一组)的任意颜色。因此,如果您想按

Name
Color
的组合进行分组,则必须按包含两者的匿名类型进行分组:

Dim fruitGroups = table.AsEnumerable().
    GroupBy(Function(row) New With {
        Key .Name = row.Field(Of String)("Name"),
        Key .Color = row.Field(Of String)("Color")
    })

Dim tableResult = table.Clone()
For Each grp In fruitGroups
    tableResult.Rows.Add(grp.Key.Name, grp.Sum(Function(row) row.Field(Of Int32)("Quantity")), grp.Key.Color)
Next

如果您需要

DataView
,您可以使用
tableResult.DefaultView


0
投票

我对此解决方案有一个后续问题。如果你必须声明 grp 的类型是什么。我正在使用一个允许您使用 VB.NET 创建工作流脚本的系统我已采用此代码,但系统要求在使用之前定义所有变量类型

© www.soinside.com 2019 - 2024. All rights reserved.