我有一个数据表,其数值很少,如下所示。
dtLabel | size | QTY
----------------------------
2015/11 | 204 | 272
2015/12 | 204 | 235
2015/11 | 204 | 254
2016/01 | 204 | 259
我正在寻找一种方法来向数据表中添加包含总数的新列 对于给定的dtLabel的QTY 所以新的数据表看起来应该是这样的
dtLabel | size | QTY | TotalQTY
--------------------------------------
2015/11 | 204 | 272 | 272+254
2015/12 | 204 | 235 | 235
2015/11 | 204 | 254 | 272+254
2016/01 | 204 | 259 | 259
Linq或lambda会很有帮助 感谢
答案 0 :(得分:1)
假设您有这样的数据表:
Dim dataTable As DataTable = New DataTable()
dataTable.Columns.Add("Id", GetType(Integer))
dataTable.Columns.Add("Date", GetType(DateTime))
dataTable.Columns.Add("Size", GetType(Integer))
dataTable.Columns.Add("Qty", GetType(Integer))
dataTable.Columns.Add("TotalQty", GetType(Integer))
dataTable.PrimaryKey = New DataColumn() {dataTable.Columns(0)}
您的数据表数据是这样的:
dataTable.Rows.Add(New Object() {1, New DateTime(2015, 11, 1), 204, 272})
dataTable.Rows.Add(New Object() {2, New DateTime(2015, 12, 1), 204, 235})
dataTable.Rows.Add(New Object() {3, New DateTime(2015, 11, 1), 204, 254})
dataTable.Rows.Add(New Object() {4, New DateTime(2016, 1, 1), 204, 259})
因此我们可以结合使用GroupBy,SelectMany和Sum来计算 TotalQty 字段
Dim results = dataTable.Rows _
.Cast(Of DataRow) _
.GroupBy(Function(s As DataRow) s.Item("Date")) _
.SelectMany(Function(rows) rows.Select(Function(row) Tuple.Create(row.Item("Id"), rows.Sum(Function(dataRow) dataRow.Item("Qty")))))
For Each result As Tuple(Of Object, Integer) In results
dataTable.Rows.Find(result.Item1).Item("TotalQty") = result.Item2
Next
然后我们可以用TotalQty计算
来显示数据表数据For Each row As DataRow In dataTable.Rows
Console.WriteLine("> Date: {0}, Size: {1}, Qty: {2}, TotalQty: {3}", row.Item(1), row.Item(2), row.Item(3), row.Item(4))
Next
输出结果为:
日期:01/11/2015 00:00:00,大小:204,数量:272,总数:526
日期:01/12/2015 00:00:00,大小:204,数量:235,总数:235
日期:01/11/2015 00:00:00,大小:204,数量:254,总数:526
日期:01/01/2016 00:00:00,大小:204,数量:259,总数:259