首页 > 解决方案 > 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" }
]

标签: c#linqdatetimelambda

解决方案


EndTime如果我理解正确,您需要合并那些在 previous和 current之间相差小于或等于 30 分钟的记录StartTime

所以假设你的数组要排序,这是我能想到的最简单的方法:

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

推荐阅读