2016-02-29 2 views
2

Я пытаюсь усреднить массив на основе критериев в другом массиве.Средний один массив на основе критериев в другом массиве

//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

[Zip] (https://msdn.microsoft.com/en-us/library/dd267698 (v = vs.110). aspx) эти две коллекции вместе, а затем группируются и усредняются. –

ответ

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

Последняя имеет одно преимущество: он не бросает, если как исключение массивы не имеют одинакового размера: «Если входные последовательности не имеют одинакового количества элементов, метод объединяет элементы, пока не достигнет конца одной из последовательностей. Например, если одна последовательность имеет th ree, а другой имеет четыре, последовательность результатов имеет только три элемента: «

Смежные вопросы