代码之家  ›  专栏  ›  技术社区  ›  Eric Bergman

LINQ:按日期范围分组(5分钟内)

  •  2
  • Eric Bergman  · 技术社区  · 6 年前

    假设我收集了以下项目和日期:

    ItemID: 1, Date: 10/10/2018 11:30 AM
    ItemID: 1, Date: 10/10/2018 11:32 AM
    ItemID: 1, Date: 10/10/2018 11:33 AM
    ItemID: 1, Date: 10/10/2018 11:34 AM
    ItemID: 1, Date: 10/10/2018 11:57 AM
    
    ItemID: 2, Date: 10/10/2018 7:45 AM
    ItemID: 2, Date: 10/10/2018 7:49 AM
    
    ItemID: 3, Date: 10/10/2018 8:45 AM
    ItemID: 3, Date: 10/10/2018 9:13 AM
    

    在上面的数据集中,以下数据将被分组

    ItemID: 1, Date: 10/10/2018 11:30 AM    <-- Grouped with Item 1
    ItemID: 1, Date: 10/10/2018 11:32 AM    <-- Grouped with Item 1
    ItemID: 1, Date: 10/10/2018 11:33 AM    <-- Grouped with Item 1
    ItemID: 1, Date: 10/10/2018 11:34 AM    <-- Grouped with Item 1
    
    
    ItemID: 1, Date: 10/10/2018 11:57 AM    <-- Not Grouped
    
    
    ItemID: 2, Date: 10/10/2018 7:45 AM    <-- Grouped with Item 2
    ItemID: 2, Date: 10/10/2018 7:49 AM    <-- Grouped with Item 2
    
    
    ItemID: 3, Date: 10/10/2018 8:45 AM    <-- Not Grouped
    
    ItemID: 3, Date: 10/10/2018 9:13 AM    <-- Not Grouped
    

    我知道如何在LINQ中按ItemID和Date对它们进行分组,但是我很难按照我描述的方式对它们进行分组。

    var groupedItems = from item in items
                  group item by new
                  {
                      item.ItemID,
                      item.Date
                  } into g
                  select g;
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   arekzyla    6 年前

    您可以尝试以下方法:

    var groupedItems = items
        .GroupBy(i => i.ItemId, (k, g) => g
            .GroupBy(i => (long)new TimeSpan(i.Date.Ticks - g.Min(e => e.Date).Ticks).TotalMinutes / 5))
        .SelectMany(g => g);
    
        2
  •  2
  •   CodeHxr    6 年前

    var dates = new List<DateTime>{ ... }; // dates get initialized however your code does it...
    
    var groups = dates.Select(d => 
        d, 
        GroupDate = new DateTime(d.Year, d.Month, d.Day, d.Hour, (d.Minute / 5) * 5, d.Second)})
        .GroupBy(g => g.GroupDate);
    

    new DateTime(...) 断开并替换为 (d.Minute / 5) * 5