我试图根据另一个数组中的条件对数组进行平均。
//array with a number of dates including hourly data
double[] dates;
//array with values, same length as dates and corresponding data points
double[] vals;
这就是我想做的事情:
double[] dailyavgs = vals.GroupBy((v, i) => DateTime.FromOADate(dates[i]).Date()).Average().ToArray();
但这失败了。你能指点我正确的方向吗?
答案 0 :(得分:2)
您可以选择匿名类型,然后使用GroupBy
:
double[] dailyavgs = vals
.Select((v, i) => new { Date = DateTime.FromOADate(dates[i]).Date, Value = v })
.GroupBy(x => x.Date)
.Select(g => g.Average(x => x.Value))
.ToArray();
使用Enumerable.Zip
的另一种类似方法:
double[] dailyavgs = vals
.Zip(dates, (v, d) => new { Date = DateTime.FromOADate(d).Date, Value = v })
.GroupBy(x => x.Date)
.Select(g => g.Average(x => x.Value))
.ToArray();
后者有一个优点:如果两个阵列不具有相同的大小,它不会抛出异常:"如果输入序列不具有相同数量的元素,则该方法组合元素直到它到达其中一个序列的末尾。例如,如果一个序列有三个元素而另一个序列有四个元素,那么结果序列只有三个元素"