特定范围内的按日期分组

Eri*_*man 3 .net c# linq group-by

假设我有以下内存中的项目和日期集合:

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
Run Code Online (Sandbox Code Playgroud)

我想按ItemID和Date进行分组,但是我希望它们分组的日期在最低日期的5分钟内,在这种情况下,项目1最低时间是:11:30 AM在接下来的几分钟11:30 + 5分钟之间

在上面的数据集中,将对以下内容进行分组

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
Run Code Online (Sandbox Code Playgroud)

分组的是彼此相差5分钟的那些.

OUTPUT:

Item 1:
Date: 10/10/2018 11:30 AM    <--- Lowest Minute is 30 so 30 + 5 range group
Date: 10/10/2018 11:32 AM
Date: 10/10/2018 11:33 AM
Date: 10/10/2018 11:34 AM

Item 1:
Date: 10/10/2018 11:57 AM

Item 2:
Date: 10/10/2018 7:45 AM
Date: 10/10/2018 7:49 AM

Item 3:
Date: 10/10/2018 8:45 AM

Item 3:
Date: 10/10/2018 9:13 AM
Run Code Online (Sandbox Code Playgroud)

are*_*yla 5

您可以先按ID分组,然后按照最小组时间除以间隔而没有提醒的总分钟数对每个组进行分组:

var interval = 5;
var groupedItems = items
    .GroupBy(i => i.ItemId, (k, g) => g
        .GroupBy(i => (long)(i.Date - g.Min(e => e.Date)).TotalMinutes / interval))
    .SelectMany(g => g);
Run Code Online (Sandbox Code Playgroud)