Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ:5分钟内按日期分组_C#_Linq_Group By - Fatal编程技术网

C# LINQ:5分钟内按日期分组

C# LINQ:5分钟内按日期分组,c#,linq,group-by,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, Da

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

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和Date进行分组,但我希望它们之间的日期间隔不超过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

您可以尝试以下方法:

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);

我尝试您的解决方案:

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);
var dates=新列表{…};//日期得到初始化,但你的代码做它。。。
变量组=日期。选择(d=>
D
GroupDate=新日期时间(d.年、d.月、d.日、d.小时,(d.分钟/5)*5,d.秒)}
.GroupBy(g=>g.GroupDate);
一分钟的数学最终会被5的整数倍分开。另一个警告是,如果您不关心日/月/年,并且希望明确地按分钟对所有内容进行分组,那么请划掉
新的日期时间(…)
部分,并替换为
(d.minute/5)*5
。这将按分钟分组,而不考虑日/月/年


希望这有帮助

请分享你的尝试?@GiladGreen更新。抱歉,我是LINQ的新手,我只是在学习。这是内存中的集合还是在数据库中执行?@GiladGreen内存中的集合需要什么输出?我尝试了以下时间:11:12、11:13、11:14和11:15,它将(11:12、11:13、11:14)分组在一起,但没有将11:15分组。第一组的IntervalKey为212249366,未分组的11:15项目的IntervalKey为212249367@EricBergman那么界限是什么呢?11:10至11:15或11:12至11:17?例如,如果我们有:11:12、11:13、11:14、11:15、11:30、11:35,则应将彼此相隔5分钟的对象分组,在这种情况下,我们应分为两组(11:12、11:13、11:14、11:15)和(11:30、11:35),可以安全地假设,在一个特定的小时内,最多只有4个项目在5分钟范围内,但没有more@EricBergman我已经更新了我的答案。那是你想要的吗?那正是我想要的,非常感谢你,阿雷克兹拉
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);