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