Linq分组和平均值

本文关键字:平均值 Linq | 更新日期: 2023-09-27 18:20:04

我有两个对象,一个是汽车对象,另一个对象用于记录有多少汽车对象在轮班,并记录这些汽车的属性。

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

这会产生编译器错误。计数=平均值。平均值(x=>x.HasExtraBaggageSpace)

你知道我该怎么做吗?

Linq分组和平均值

如何计算布尔值的平均值?我认为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))
    });
}