2011-09-16 70 views
3

一组查询我有2种类型:遇到问题表达LINQ

public class TimedValue 
{ 
    public DateTime TimeStamp { get; set; } 
    public double Value { get; set; } 
} 

public class Stats 
{ 
    IList<TimedValue> Values { get; set; } 
    ... // some other fields 
} 

统计的多个实例存储在一个IEnumerable集合对象。我试图想出一个LINQ查询,它会给我所有Stats实例的按时间顺序的Value总数。这意味着它会经历每个Stats对象中的每个TimedValue,并且如果它们的TimeStamps匹配,它将添加Value字段。所以最后我会得到一份按时间顺序排列(从最旧到最新)的双打名单。

在LINQ方面很弱,我在这方面失败了。我只得到尽可能做到:

.Select(stat => stat.Values) 

要向下投射到:

List<List<Value>> 

这是统计对象,我需要的子集,但我无法弄清楚如何组我需要的总值。

例子(因为有一些混乱,我的意思):

假设我们有一个统计数据的2个实例,我在这里简化符号,只是为了让例子短:

Stats1 :值= {{“Monday”,1.1},{“Tuesday”,2.2}}
Stats2:Values = {{“Monday”,1.1},{“Tuesday”,2.2},{“Friday” 3.3}}

结果应该是双打列表:{2.2,4.4 ,3.3}

+2

这是LINQ的真棒资源。 http://msdn.microsoft.com/en-us/vcsharp/aa336746 –

+0

您是否想要把它们都在一个单独的列表,如清单或你想要值的每个子列表是一个聚合值某种如平均时间戳和平均值? –

+0

增加了一个例子来澄清所需的最终结果。 –

回答

3

这应该给你包含的款项双打名单:

statList.SelectMany(stat => stat.Values) 
     .GroupBy(x => x.TimeStamp) 
     .OrderBy(g => g.Key) 
     .Select(g => g.Sum(x => x.Value)); 
     .ToList(); 

如果你不想的款项(在这个问题不是完全清楚的),这将给你刚刚名单分组:

var timeStampGroups = statList.SelectMany(stat => stat.Values) 
           .GroupBy(x => x.TimeStamp) 
           .OrderBy(g => g.Key) 
           .ToList(); 
+0

用一个例子更新了我的问题。 –

+0

@Alex K:第一个解决方案应该适合你 – BrokenGlass

0

更新为请求返回双打的名单。

这应该做的伎俩:

var values = (from stat in statsCollection 
       from value in stat.Values 
       //group the values by the timestamp 
       group value by value.TimeStamp into grouping 
       orderby grouping.Key 
       select grouping.Sum(v => v.Value)).ToList(); 

下面是输出:

output