Linq Grouping和平均值

时间:2014-08-31 10:36:09

标签: c# linq

我有两个对象,一个是汽车对象,另一个是我用来记录轮班车数量的对象,并记录这些汽车的属性。

public class Car
{
    public int Id { get; set; }
    public bool OnShift { get; set; }
    public bool HasExtraBaggageSpace { get; set; }


}

public class Log
{
    public DateTime TimeStamp { get; set; }
    public int CarId { get; set; }
    public bool HasExtraBaggageSpace { get; set; }

}

应用程序每五分钟选择轮班的所有汽车并将信息写入日志对象并将其插入列表日志。

在记录三周后,我现在想要返回一个反映过去三周平均值的数字。例: 我可以在14:00星期四预计有多少辆带有HasExtraBaggageSpace的汽车。

公共类myApp    {

  public class AverageReturnArgs
     {
       public int Hour { get; set; }
       public int Minute { get; set; }
       public int Count { get; set; }

     }



    public AverageReturnArgs GetAverage(List<Log> logs, DateTime TimeReq)
    {
        int hour = TimeReq.Hour;
        int min = TimeReq.Minute;
        var average = logs.GroupBy(grpByHourMin => new
        {
            hour = grpByHourMin.TimeStamp.Hour,
            min = grpByHourMin.TimeStamp.Minute
        }).Select(av => new AverageReturnArgs()
        {
            Hour = av.Key.hour,
            Minute = av.Key.min,
            Count = av.Average(x => x.HasExtraBaggageSpace)
        });
    }
}

这会产生编译错误。    Count = av.Average(x =&gt; x.HasExtraBaggageSpace)

我有什么想法可以做到这一点?

1 个答案:

答案 0 :(得分:2)

您如何计算布尔值的平均值? 我认为Count聚合应该是你想要的:

Count = av.Count(x => x.HasExtraBaggageSpace)

编辑如果您要计算拥有 ExtraBaggageSpace 的汽车百分比,您可以尝试这样的事情:

Count = av.Average(x => x.HasExtraBaggageSpace ? 1 : 0)

使用三元运算符,此表达式将您的布尔值转换为整数并计算平均值(将为Double)。

编辑2

这是您的行应该是什么样子。 计数应该是Double类型。

Count = av.Average(x => av.Count(y=>y.HasExtraBaggageSpace))

编辑3

好的逻辑是错的:

public AverageReturnArgs GetAverage(List<Log> logs, DateTime TimeReq)
{
    int hour = TimeReq.Hour;
    int min = TimeReq.Minute;
    var average = logs
    .Where(log => log.TimeStamp.Hour == hour && log.TimeStamp.Minute == min)
    .GroupBy(grp => grp.TimeStamp)
    .Select(av => new AverageReturnArgs()
    {
        Hour = hour,
        Minute = min,
        Count = av.Average(x => av.Count(y=>y.HasExtraBaggageSpace))
    });
}