我有一个DateTime列表。我还允许用户选择一个int的Interval并表示小时数。另请注意,DateTime列表是从最早的日期到最晚的日期订购的。
如果用户选择6小时,那么我将转到第一个索引并查看第二个索引是否在第一个索引的6个小时内。如果是这样,则将这两个分组。然后我转到第三个索引,看看它是否在第二个索引的6个小时内,如果是,那么它也进入第一个组。依此类推,直到我们来到比之前的索引晚6个小时的那个。在那种情况下,然后我们将启动第二组DateTime,然后我们将检查下一个索引以查看它是否在6小时内(如果是)然后将其添加到第二组。依此类推,直到最后一个索引。
我希望在优雅的linq声明中做到这一点。此外,速度可能是一个问题,因为如果不是成千上万的DateTime列表,可能会有数千个。
答案 0 :(得分:4)
您正在寻找在满足条件时对连续项目进行分组的方法。这是一种用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);