我有一个像这样的项目列表:
列表中的每个元素都遵循相同的结构。每个Y
属性都是int[]
,其中包含3个值。
然后我在此列表上执行GroupBy
将数据拆分为60秒:
var newChart = chart.GroupBy(x => x.DateAdded.RoundUp(TimeSpan.FromSeconds(60)));
RoundUp
是我从这里获得的扩展方法:How can I round up the time to the nearest X minutes?
这会创建一个类似的列表,其中的值按分组分组,这是我所期望的:
例如,对于分钟20:18
,有5个条目,此值可能会更改,有时可能会有6个条目,有时会有1个条目等等。
所以我的问题是,我如何将这个新的Grouped By列表转换为我原始List的类型,其中Y
值具有该组中的那些条目的平均值。我已尝试过以下操作,但Y
值包含的条目超过3个:
var newChart = chart.GroupBy(x => x.DateAdded.RoundUp(TimeSpan.FromSeconds(60)))
.Select(x => new ChartPoint
{
DateAdded = x.Key,
X = x.Key.ToString(@"HH:mm:ss"),
Y = x.Select(y => (int)Math.Round(y.Y.Average(z => z), 0, MidpointRounding.AwayFromZero)).ToArray()
});
例如,如果20:18
的条目只有2个条目,条目1的Y值为:3, 4, 5
,条目2的值为:5, 10, 11
。然后我希望此新列表中20:18
的{{1}}条目如下:Y
因为:4, 7, 8
,(3+5)/2 = 4
,{{1} }
答案 0 :(得分:1)
不是获取组中每个数组的平均值,而是创建一个范围,该范围是数组的长度,并获得每个数组中相应项的平均值:
var newChart = chart.GroupBy(x => x.DateAdded.RoundUp(TimeSpan.FromSeconds(60)))
.Select(x => new ChartPoint
{
DateAdded = x.Key,
X = x.Key.ToString(@"HH:mm:ss"),
Y = Enumerable.Range(0, 3).Select(i => (int)Math.Round(x.Average(z => z.Y[i]))).ToArray()
});