分组日期时间列表,按时间间隔对每个分组进行分隔

本文关键字:时间 分隔 日期 列表 | 更新日期: 2023-09-27 18:23:43

我有一个DateTime列表。我还允许用户选择一个Interval,它是一个int,表示小时。还假设DateTime列表是从最早日期到最晚日期排序的。

如果用户选择6小时,那么我会转到第一个索引,看看第二个索引是否在第一个索引的6小时内。如果是,则将这2个分组。然后我转到第三个指数,看看它是否在第二个指数的6小时内,如果是,那么它也进入第一组。以此类推,直到我们得出一个比上一个指数晚6个多小时的指数。在这种情况下,我们将启动第二组DateTime,然后检查下一个索引,看看它是否在6小时内。如果是,那么它将被添加到第二组中。以此类推,直到最后一个索引。

我希望用一句优美优雅的linq语句来表达这一点。速度也可能是一个问题,因为列表中可能有数千甚至数万的DateTime。

分组日期时间列表,按时间间隔对每个分组进行分隔

您正在寻找一种在满足条件时对连续项进行分组的方法。这是一种用LINQ风格的编程编写的相当简单的方法:

public static IEnumerable<IEnumerable<T>> GroupWhile<T>(
    this IEnumerable<T> source, Func<T, T, bool> predicate)
{
    using (var iterator = source.GetEnumerator())
    {
        if (!iterator.MoveNext())
            yield break;
        List<T> list = new List<T>() { iterator.Current };
        T previous = iterator.Current;
        while (iterator.MoveNext())
        {
            if (!predicate(previous, iterator.Current))
            {
                yield return list;
                list = new List<T>();
            }
            list.Add(iterator.Current);
            previous = iterator.Current;
        }
        yield return list;
    }
}

一旦你有了这个方法,你就可以写:

var groups = dates.GroupWhile((previous, current) => previous.AddHours(6) >= current);