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

时间:2014-09-19 19:13:54

标签: c# linq datetime

我有一个DateTime列表。我还允许用户选择一个int的Interval并表示小时数。另请注意,DateTime列表是从最早的日期到最晚的日期订购的。

如果用户选择6小时,那么我将转到第一个索引并查看第二个索引是否在第一个索引的6个小时内。如果是这样,则将这两个分组。然后我转到第三个索引,看看它是否在第二个索引的6个小时内,如果是,那么它也进入第一个组。依此类推,直到我们来到比之前的索引晚6个小时的那个。在那种情况下,然后我们将启动第二组DateTime,然后我们将检查下一个索引以查看它是否在6小时内(如果是)然后将其添加到第二组。依此类推,直到最后一个索引。

我希望在优雅的linq声明中做到这一点。此外,速度可能是一个问题,因为如果不是成千上万的DateTime列表,可能会有数千个。

1 个答案:

答案 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);