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)
你知道我该怎么做吗?
如何计算布尔值的平均值?我认为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))
});
}