C# Linq分组和平均值

C# Linq分组和平均值,c#,linq,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 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会有多少辆车有多余的行李空间

公共类myApp {

public类AverageReturnArgs
{
公共整数小时{get;set;}
公共整数分钟{get;set;}
公共整数计数{get;set;}
}
public AverageReturnArgs GetAverage(列表日志、日期时间时间请求)
{
整小时=时间要求小时;
int min=时间要求分钟;
var average=logs.GroupBy(grpByHourMin=>new
{
小时=grpByHourMin.TimeStamp.hour,
min=grpByHourMin.TimeStamp.Minute
}).Select(av=>newaveragereturnargs()
{
小时=平均钥匙小时,
分钟=av.Key.min,
计数=平均值(x=>x.HasExtraBaggageSpace)
});
}
}
这将产生一个编译器错误。 计数=平均值(x=>x.HasExtraBaggageSpace)


你知道我如何做到这一点吗?

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

Count = av.Count(x => x.HasExtraBaggageSpace)
编辑如果您想计算拥有额外行李空间的汽车的百分比,您可以尝试以下方法:

Count = av.Average(x => x.HasExtraBaggageSpace ? 1 : 0)
使用三元运算符,此表达式将布尔值转换为整数,并计算平均值(即双精度)

编辑2

这是你的线路应该是什么样子。 计数应为双精度类型

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))
    });
}
public AverageReturnArgs GetAverage(列出日志、日期时间时间请求)
{
整小时=时间要求小时;
int min=时间要求分钟;
var平均值=日志
.Where(log=>log.TimeStamp.Hour==Hour&&log.TimeStamp.Minute==min)
.GroupBy(grp=>grp.TimeStamp)
.Select(av=>newaveragereturnargs()
{
小时=小时,
分钟=分钟,
计数=平均值(x=>av.Count(y=>y.HasExtraBaggageSpace))
});
}

我的意思是,在过去三周中,每周四的14:00有n个日志。其中有些会有额外的行李空间,有些则不会。如果week1=3 week2=2 week3=1,平均值是2。我可以,但这就像在三个不同的时间计算布尔属性并平均它们一样简单。差不多就是这样。只是无法获取linq语法。如果原始问题含糊不清,很抱歉。你能试试我的编辑2吗?它首先为每个组计算具有ExtraBaggageSpace的日志计数,然后计算所有组的平均值。EDIT 2返回计数,而不是平均值。如果wk1=1 wk2=1 wk3=1,则应返回平均值=1,但返回3Ok,则逻辑错误。在编辑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))
    });
}