我有两种类型:
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}
答案 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();
这是输出: