在vb.net的DataTable中汇总重复的行

时间:2018-09-17 11:06:20

标签: vb.net datatable

我有一个看起来像这样的CSV文件:

19177;string1;
10017;string2;6765,00
10017;string2;240,00
10238;string3;350,00
10238;string3;750,00
10238;string3;60170,00
10238;string3;1035,00

我已经能够使用vb.net将其放入DataTable中。现在,我想使用列号1 + 2并将列号3求和,将重复项分组在一起,以便生成一个新的CSV文件,如下所示:

19177;string1;
10017;string2;7005,00
10238;string3;62305,00

我进行了很多搜索,发现我可能可以使用称为LINQ的东西,但是有什么方法可以在纯vb.net中做到这一点?我似乎无法掌握如何执行此操作的概念。

编辑:

我希望避免使用LINQ,因此为每个语句使用a似乎应该可以管理。这样的事情会是一个好的开始吗?还是我在这里完全错了?

For Each r As DataRow In mytable.Rows
    For Each item In r.ItemArray
        Do something
    Next
Next

我觉得自己在这里是错误的“层”,因此我很难在脑海中将其概念化以在代码中体现出来。我需要比较整行,而不仅仅是像这样的单个项目。

1 个答案:

答案 0 :(得分:0)

最简单的解决方案是使用linq。如果您想避免使用linq,可以,但是您需要编写更多的代码行。无论如何,这是一个示例,显示了如何使用linq根据前两列对行进行分组,然后计算第三列的总和。

比方说,输入数据表包含从CSV文件加载的C1(Inetegr),C2(String),C3(Integer)列:

C1   | C2   | C3    
-------------------
1    |One   | 100
1    |One   | 200
2    |Two   | 300
2    |Two   | 400
3    |Three | 500

仅出于测试目的,这是数据表:

Dim dt = New DataTable()
dt.Columns.Add("C1", GetType(Integer))
dt.Columns.Add("C2", GetType(String))
dt.Columns.Add("C3", GetType(Integer))
dt.Rows.Add(1, "One", 100)
dt.Rows.Add(1, "One", 200)
dt.Rows.Add(2, "Two", 300)
dt.Rows.Add(2, "Two", 400)
dt.Rows.Add(3, "Three", 500)

要获得预期的结果,可以使用以下代码:

Dim q = From r In dt.AsEnumerable()
        Select C1 = r.Field(Of Integer)("C1"),
                C2 = r.Field(Of String)("C2"),
                C3 = r.Field(Of Integer)("C3")
        Group By C1, C2 Into Group
        Select C1, C2, C3 = Group.Sum(Function(x) x.C3)
Dim result = dt.Clone()
For Each item In q
    result.Rows.Add(item.C1, item.C2, item.C3)
Next

结果将是:

C1   | C2   | C3    
-------------------
1    |One   | 300
2    |Two   | 700
3    |Three | 500