【问题标题】:How to group dictionary by dateTime and do a sum on int如何按 dateTime 对字典进行分组并对 int 进行求和
【发布时间】:2013-03-28 02:35:16
【问题描述】:

我有这个代码:

    var tradeReqsBySegment = segGroups.Join(pPeriods, s => s.MarketSegmentId, p => p.EntityId, (s, p) => new
    {
        SegmentCode = s.SegmentCode, // string
        Time = p.StartLocal, // datetime
        TradeRequirement = p.Volume // double
    })
    .GroupBy(s => s.SegmentCode)
    .ToDictionary(g => g.Key, g => g.ToDictionary(i => i.Time, i=>i.TradeRequirement));

我希望将 g.ToDictionary(i => i.Time, i=>i.TradeRequirement)) 按时间分组,并将 TradeRequirement 汇总或平均。我该如何处理?

此外,是否可以按月对时间进行分组,例如 get :

Time - TradeReq
01/2013 - 500
02/2013 - 234
...

【问题讨论】:

标签: c# linq lambda group-by aggregate-functions


【解决方案1】:
g.GroupBy(gr => new DateTime(gr.Time.Year, gr.Time.Month, 1))
         .ToDictionary(i => i.Key, i => i.Sum(s => s.TradeRequirement));

【讨论】:

    【解决方案2】:

    你可以同时得到:SumAverage,使用匿名类型:

    var tradeReqsBySegment = segGroups.Join(pPeriods, s => s.MarketSegmentId, p => p.EntityId, (s, p) => new
    {
        SegmentCode = s.SegmentCode, // string
        Time = p.StartLocal, // datetime
        TradeRequirement = p.Volume // double
    })
    .GroupBy(s => s.SegmentCode)
    .ToDictionary(g => g.Key,
                  g => g.GroupBy(gr => new DateTime(gr.Time.Year, gr.Time.Month, 1))
                        .ToDictionary(gr => gr.Key.ToString("MM/yyyy"),
                                      gr => new {
                                          Sum = gr.Sum(s => s.TradeRequirement),
                                          Avg = gr.Average(s => s.TradeRequirement)
                                      }));
    

    【讨论】:

    • 确实很有帮助。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2012-05-18
    相关资源
    最近更新 更多