2013-06-21 108 views
2

我需要一些帮助来聚合我的集合中的数据。Linq Groupby通过嵌套的可观察集合

的RrvResponse类

/// <summary> 
    /// The RRV response. 
    /// </summary> 
    public class RrvResponse 
    { 
     /// <summary> 
     /// Initializes a new instance of the <see cref="RrvResponse"/> class. 
     /// </summary> 
     public RrvResponse() 
     { 
      this.BoDPoints = new ObservableCollection<BidOfferPoint>();  
     } 

     /// <summary> 
     /// Gets or sets the id. 
     /// </summary> 
     public string Id { get; set; } 

     /// <summary> 
     /// Gets or sets the message date. 
     /// </summary> 
     public DateTime MessageDate { get; set; } 

     /// <summary> 
     /// Gets or sets the BOD points. 
     /// </summary> 
     public ObservableCollection<BidOfferPoint> BoDPoints { get; set; } 
    } 

实施,

var responses = new ObservableCollection<RrvResponse>(); 

// ....Load responses... 
// ... 
// ... 

响应的次数为5,所以我有5个的ObservableCollection内响应BoDPoints的。

BOD points are, 

    /// <summary> 
     /// The bid offer point. 
     /// </summary> 
     public class BidOfferPoint 
     { 

      /// <summary> 
      /// Gets or sets the date. 
      /// </summary> 
      public DateTime Date { get; set; } 

      /// <summary> 
      /// Gets or sets the time. 
      /// </summary> 
      public string Time { get; set; } 

      /// <summary> 
      /// Gets or sets the volume. 
      /// </summary> 
      public decimal Volume { get; set; } 

      /// <summary> 
      /// Gets or sets the price. 
      /// </summary> 
      public decimal Price { get; set; } 
     } 

样品,

Observable Collection Bod - 1 
2013-06-21 
00:00 
100 
10 

2013-06-21 
00:15 
120 
15 

2013-06-21 
00:30 
150 
9 

观察集合布德 - 2

2013-06-21 
00:00 
Observable Collection Bod - 1 
2013-06-21 
00:00 
100 
10 

2013-06-21 
00:15 
120 
15 

2013-06-21 
00:30 
150 
9 
40 
1 

2013-06-21 
00:15 
10 
0.5 

2013-06-21 
00:30 
11 
0.1 

观察集合布德 - 3

2013-06-15 
00:00 
100 
10 

2013-06-15 
00:15 
120 
15 

2013-06-15 
00:30 
150 
9 

我想按日期然后小时横跨组收集和汇总卷。因此在上面的例子中,所有21-06-2013小时00:00的数据都应该汇总,21:00-2013小时00:15的所有数据都应该汇总。

什么是最好的方法使用Linq来做到这一点?

回答

1

您可以使用SelectMany聚集的项目,后来他们组:

var result = responses 
    .SelectMany(r => r.BoDPoints) 
    .GroupBy(p => p.Date) 
    .Select(byDate => 
     new 
     { 
      Date = byDate.Key, 
      EntriesByTime = byDate 
       .GroupBy(p => p.Time) 
       .Select(byTime => 
        new 
        { 
         Time = byTime.Key, 
         TotalVolume = byTime.Sum(p => p.Volume) 
        }) 
     }); 

您可以使用下面的循环(如输出总体积)

foreach (var byDate in result) 
{ 
    Console.WriteLine("Entries for date " + byDate.Date); 
    foreach (var byTime in byDate.EntriesByTime) 
    { 
     Console.WriteLine("Total volume for time " + byTime.Time + ": " + byTime.TotalVolume); 
    } 
} 
+0

如何获得总和的数量? –

+0

啊,你想要的总量。见编辑的答案。 –

+0

非常感谢,很有魅力! –