按类似日期分组

时间:2013-12-06 20:21:16

标签: c# asp.net-mvc asp.net-mvc-4

我想知道是否可以在两个日期之间对我从数据库中获得的结果进行分组。例如,我希望能够将相距6秒的结果分组,以便我可以将它们分组显示在前端。

我的最终目标是能够按截止日期/时间(例如相隔6秒)对结果进行分组。

2 个答案:

答案 0 :(得分:5)

我们可以使用这个一般的帮助器方法,它接受一个序列和一个谓词,它接受每对连续的项目并确定它们是否在同一个组中以对项目进行分组:

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))
            {
                list.Add(iterator.Current);
            }
            else
            {
                yield return list;
                list = new List<T>() { iterator.Current };
            }

            previous = iterator.Current;
        }
        yield return list;
    }
}

现在我们已经拥有了它的简单内容:

var query = data.OrderBy(item => item.Date)
    .GroupWhile((prev, next) => 
        (prev.Date - next.Date) <= Timespan.FromSeconds(6));

答案 1 :(得分:1)

我创造了一些可以做我想做的事情。它可能不是最好的,但它确实有效。这就是我所做的:

Dictionary<DateTime, List<UserFeed>> feedGrouped = new Dictionary<DateTime,List<UserFeed>>();

foreach(var item in userFeed.OrderByDescending(I => I.Date))
{
    if(feedGrouped.Count >= 15)
        break;

    if (feedGrouped.Where(i => i.Key <= item.Date.AddSeconds(7)).Any())
    {
        feedGrouped.Where(i => i.Key <= item.Date.AddSeconds(7)).FirstOrDefault().Value.Add(item);
    }
    else
    {
        feedGrouped.Add(item.Date, new List<UserFeed> { item });
    }
}