我的LINQ查询返回一年中每个月的总数,我将其暴露为匿名类型的12个属性(名为January, February, March…)。这使得无法循环遍历这12个值。是否有一种方法来代替返回包含所有12个值的单个索引属性?
这是我的:
Dim MyTotals = Aggregate CostRow In AllTargetRows _
Into January = Sum(CostRow.January),
February = Sum(CostRow.February),
March = Sum(CostRow.March), _
...
Total = Sum(CostRow.Total)
这就是我想要实现的(编译器不喜欢这个):
Dim MyTotals = Aggregate CostRow In AllTargetRows _
Into Values = {Sum(CostRow.January),
Sum(CostRow.February),
Sum(CostRow.March), _
...
},
Total = Sum(CostRow.Total)
我就可以做MyTotals.Values(i)
之类的事情了
我想到的第一件事是使用Aggregate
函数填充字典。像这样:
Dim MyTotals =
AllTargetRows
.Aggregate(
new Dictionary<string, int>()
{
{ "January", 0 },
{ "February", 0 },
{ "March", 0 },
{ "April", 0 },
{ "May", 0 },
{ "June", 0 },
{ "July", 0 },
{ "August", 0 },
{ "September", 0 },
{ "October", 0 },
{ "November", 0 },
{ "December", 0 },
{ "Total", 0 }
},
(acc, costRow) =>
{
acc["January"] += costRow.January;
acc["February"] += costRow.February;
acc["March"] += costRow.March;
acc["April"] += costRow.April;
acc["May"] += costRow.May;
acc["June"] += costRow.June;
acc["July"] += costRow.July;
acc["August"] += costRow.August;
acc["September"] += costRow.September;
acc["October"] += costRow.October;
acc["November"] += costRow.November;
acc["December"] += costRow.December;
acc["Total"] += costRow.Total;
return acc;
});
这将产生一个字典,其中键是一年中的月份(和'total'),值是每个月的值之和。
对不起,我错过了VB。净标签。VB。.NET不是我的强项,但我认为这在VB.NET中是等价的。
Dim MyTotals = _
AllTargetRows _
.Aggregate( _
New Dictionary(Of String, Integer) From { _
{"January", 0}, _
{"February", 0}, _
{"March", 0}, _
{"April", 0}, _
{"May", 0}, _
{"June", 0}, _
{"July", 0}, _
{"August", 0}, _
{"September", 0}, _
{"October", 0}, _
{"November", 0}, _
{"December", 0}, _
{"Total", 0} _
}, _
Function(acc, costRow)
acc("January") += costRow.January
acc("February") += costRow.February
acc("March") += costRow.March
acc("April") += costRow.April
acc("May") += costRow.May
acc("June") += costRow.June
acc("July") += costRow.July
acc("August") += costRow.August
acc("September") += costRow.September
acc("October") += costRow.October
acc("November") += costRow.November
acc("December") += costRow.December
acc("Total") += costRow.Total
Return acc
End Function)
我不知道Aggregate
函数的这种过载是否可以转换为查询语法。一种(可能更简单的)替代方法是完全放弃LINQ,在运行查询之前简单地创建字典,然后循环遍历每一行并以这种方式填充字典。像这样:
Dim MyTotals = _
New Dictionary(Of String, Integer) From { _
{"January", 0}, _
{"February", 0}, _
{"March", 0}, _
{"April", 0}, _
{"May", 0}, _
{"June", 0}, _
{"July", 0}, _
{"August", 0}, _
{"September", 0}, _
{"October", 0}, _
{"November", 0}, _
{"December", 0}, _
{"Total", 0}}
For Each costRow as AllTargetRow in AllTargetRows
MyTotals("January") += costRow.January
MyTotals("February") += costRow.February
MyTotals("March") += costRow.March
MyTotals("April") += costRow.April
MyTotals("May") += costRow.May
MyTotals("June") += costRow.June
MyTotals("July") += costRow.July
MyTotals("August") += costRow.August
MyTotals("September") += costRow.September
MyTotals("October") += costRow.October
MyTotals("November") += costRow.November
MyTotals("December") += costRow.December
MyTotals("Total") += costRow.Total
Next