每n分钟分组一次

bal*_*dre 12 c# linq

我正在玩LINQ,我想知道按分钟分组是多么容易,但我不想每分钟一次,而是每5分钟分组一次.

例如,目前我有:

var q = (from cr in JK_ChallengeResponses
        where cr.Challenge_id == 114
        group cr.Challenge_id 
            by new { cr.Updated_date.Date, cr.Updated_date.Hour, cr.Updated_date.Minute } 
            into g 
        select new {
          Day = new DateTime(g.Key.Date.Year, g.Key.Date.Month, g.Key.Date.Day, g.Key.Hour, g.Key.Minute, 0),
          Total = g.Count()
        }).OrderBy(x => x.Day);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我每隔5分钟要对结果进行分组怎么办?

mel*_*okb 14

要按n某种方式分组,您可以使用以下公式来创建"存储桶":

((int)(total / bucket_size)) * bucket_size
Run Code Online (Sandbox Code Playgroud)

这将取总数,除以它,转换为整数以丢弃任何小数,然后再次相乘,最终得到倍数bucket_size.所以例如(/是整数除法,因此不需要强制转换):

group cr.Challenge_id
    by new { cr.Updated_Date.Year, cr.Updated_Date.Month, 
             cr.Updated_Date.Day, cr.Updated_Date.Hour,
             Minute = (cr.Updated_Date.Minute / 5) * 5 }
Run Code Online (Sandbox Code Playgroud)

  • 我认为你需要给Minute属性一个名字,例如Minute =(cur.Updated_Date.Minute/5)*5 (2认同)
  • @abatishchev:正如帖子中所解释的那样,`/`导致整数除法,所以如果你进行整数除法然后乘以一些数字`n`,它相当于向下舍入到最接近的'n`倍数.用一个具体的例子来理解我的意思.如果你拿"13/5"得到"2",那么拿"2*5"得到"10".实际上,"13"向下舍入到最接近的"5"倍数将是"10".对于有效地将数字分组为"n"大小的存储桶来说,这是一种"黑客攻击":) (2认同)