具有GroupBy的平均int数组元素

时间:2014-06-23 19:30:08

标签: c# linq

我有一个像这样的项目列表:

enter image description here

列表中的每个元素都遵循相同的结构。每个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?

这会创建一个类似的列表,其中的值按分组分组,这是我所期望的:

enter image description here

例如,对于分钟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()
});

enter image description here

例如,如果20:18的条目只有2个条目,条目1的Y值为:3, 4, 5,条目2的值为:5, 10, 11。然后我希望此新列表中20:18的{​​{1}}条目如下:Y因为:4, 7, 8(3+5)/2 = 4,{{1} }

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()
});