分组日期时间列表,按时间间隔对每个分组进行分隔
本文关键字:时间 分隔 日期 列表 | 更新日期: 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);