2014-08-31 183 views
0

我有两个对象,一个是汽车对象,另一个是我用来记录有多少汽车物体正在轮班并记录这些汽车具有哪些属性。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 => x.HasExtraBaggageSpace)

任何想法我可以做到这一点?

回答

2

你会如何计算布尔值的平均值? 我认为Count聚合应你正在寻找的东西:

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

编辑如果你的意思是计算具有ExtraBaggageSpace车厢的百分比,你可以尝试这样的事:

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

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

EDIT 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)) 
    }); 
} 
+0

我的意思是,在14:00每星期四为过去三周没有为n日志。其中一些将有HasExtraBaggageSpace和一些不会。如果周1 = 3周2 = 2周3 = 1平均为2. – Paul 2014-08-31 10:54:33

+0

嗯,我可以,但它很简单,就像在三个不同时间对布尔属性进行计数并求平均值一样。这几乎是它。只是不能获得linq语法。如果原始问题模糊,请联系。 – Paul 2014-08-31 11:30:13

+0

你可以试试我的编辑2?它首先为每个组计算具有* ExtraBaggageSpace *的* Logs *的计数,然后计算所有组的平均值。 – Ndech 2014-08-31 11:46:25