在LINQ中表达组查询时遇到问题

时间:2011-09-16 19:10:29

标签: c# .net linq group-by

我有两种类型:

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

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

Stats的多个实例存储在IEnumerable集合对象中。我正在尝试提出一个LINQ查询,该查询将为我提供所有Stats实例的按时间顺序排列的值。这意味着它会遍历每个Stats对象中的每个TimedValue,如果它们的TimeStamps匹配,它将添加Value字段。所以最后我会得到一个按时间顺序排列的(从最旧到最新)的双打列表。

在LINQ处于弱势,我在这方面失败了。我只能这么做:

.Select(stat => stat.Values)

投射到:

List<List<Value>>

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

示例(因为我的意思存在一些混淆):

假设我们有两个统计数据实例,我在这里简化表示法,只是为了简化示例:

Stats1 :值= {{“星期一”,1.1},{“星期二”,2.2}} 统计数据2 :值= {{“星期一”,1.1},{“星期二”,2.2},{“星期五”,3.3}}

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

2 个答案:

答案 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();

答案 1 :(得分: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