LINQ表达式从集合中获取平均值

时间:2015-04-09 16:45:04

标签: c# linq average

我是否可以使用任何LINQ表达式来获取集合的平均值,按Station字段分组并按日期返回?

这是我的代码:

public class DatosDto 
{
    public string EstacionSensorEstacionNombre { get; set; }

    public DateTime Fecha { get; set; }

    public float Valor { get; set; }
}

我有这段代码:

double average = myCollection.Average(a => a.Valor);

返回此值:

 Managua
 Date         Average.
 15-01-2013   15
 16-01-2013   16
 Rio Grande
 15-01-2013   25
 16-01-2013   196

2 个答案:

答案 0 :(得分:1)

一些有趣的嵌套GroupBy应该可以解决问题:

var grouped = stations
    .GroupBy(s => s.EstacionSensorEstacionNombre) //Get all stations grouped
    .Select(g => new 
    { 
        Station = g.Key,
        DateAverages = g //All of the same named stations
            .GroupBy(sub => sub.Fecha.Date) //Group those by date
            .Select(subg => new 
            { 
                subg.Key, 
                Average = subg.Select(s => s.Valor).Average() 
            })
    });

答案 1 :(得分:0)

这是我的解决方案。将Console.WriteLine替换为您想要使用的任何内容。

foreach (var station in myCollection.GroupBy((s) => s.EstacionSensorEstacionNombre))
        {
            Console.WriteLine(station.Key); // station name
            foreach (var date in station.GroupBy((s) => s.Fecha))
            {
                Console.WriteLine(date.Key.ToString() + "   " + date.Average(a => a.Valor)); //date + average value
            }
        }

您可能想要替换

(s) => s.Fecha

只能比较日/月/年而不是一天中的时间。

(s) => s.Fecha.Year * 1000 + s.Fecha.DayOfYear

有点hacky,但它应该做的工作。