C# Linq - 根据"开始时间"和"结束时间"中的时差进行分组



我有一个看起来像这样的对象:

[
{ StartTime: "05/21/2020 10:00", EndTime: "05/21/2020 10:30" },
{ StartTime: "05/21/2020 11:00", EndTime: "05/21/2020 11:30" },
{ StartTime: "05/21/2020 12:00", EndTime: "05/21/2020 12:30" },
{ StartTime: "05/21/2020 15:00", EndTime: "05/21/2020 15:30" },
{ StartTime: "05/21/2020 16:00", EndTime: "05/21/2020 16:30" },
{ StartTime: "05/21/2020 18:00", EndTime: "05/21/2020 18:30" },
{ StartTime: "05/21/2020 19:00", EndTime: "05/21/2020 19:30" },
{ StartTime: "05/21/2020 20:00", EndTime: "05/21/2020 20:30" },
{ StartTime: "05/21/2020 21:00", EndTime: "05/21/2020 21:30" }
]

我想使用 linq 对它们进行分组以创建一个如下所示的对象,分组依据应基于第一个对象的结束时间和下一个对象的开始时间之间的时间差,正如您在对象数组中看到的,前三个对象在下一个对象的结束时间和开始时间之间有 30 分钟的差异,因此表明它们是相互关联的, 所以我应该采用第一个对象的开始时间和最后一个对象的结束时间,并创建一个这样的对象:

[
{ StartTime: "05/21/2020 10:00", EndTime: "05/21/2020 12:30" },
{ StartTime: "05/21/2020 15:00", EndTime: "05/21/2020 16:30" },
{ StartTime: "05/21/2020 18:00", EndTime: "05/21/2020 21:30" }
]

如果我理解正确,您需要合并那些在上一个EndTime和当前StartTime之间差异小于或等于 30 分钟的记录。

因此,假设您的数组将被排序,这是我能想到的最简单的方法:

public List<YourObject> MergeTimes(List<YourObject> list)
{
List<YourObject> result = new List<YourObject>();
result.Add(list.First());
for (int i = 1; i < list.Count; i++)
{
if ((list[i].StartTime - list[i - 1].EndTime).TotalMinutes <= 30)
result.Last().EndTime = list[i].EndTime;
else
result.Add(new { StartDate = list[i].StartTime, EndTime = list[i].EndTime });
}
return result;
}