2015-05-31 38 views
0

我的LINQ查询返回一年中每个月的总计,我公开的是匿名类型的十二个属性(名称为一月,二月,三月......)。这使得无法循环十二个值。有没有办法改为返回包含所有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)样的东西。

+0

字典呢? – ilans

+0

@ilanS:我猜想会有一个'Dictionary'。问题是,怎么样? – dotNET

+0

你究竟做了什么?“这使得无法遍历十二个值。” ? – ilans

回答

0

我首先想到的是使用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; 
      }); 

这将导致一个字典,其中键是一年中的月份(和“总”)和值是每个月的值的总和。

对不起,我错过了VB.NET标记。 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 
+0

这是VB。 NET或C#? – dotNET

+0

你也知道它的查询语法吗? – dotNET