c# – 使用List上的LINQ基于连续日期返回子集列表

前端之家收集整理的这篇文章主要介绍了c# – 使用List上的LINQ基于连续日期返回子集列表前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个场景,我有一个对象列表,在对象中有一个日期时间字段.我试图找出是否有办法使用LINQ按顺序日期时间对列表进行分组,并返回列表的子集,其中顺序日期时间为范围.
public virtual IList<LineItem> LineItems { get; set; }
...
public class LineItem
{
    public virtual string Status { get; set; }
    public virtual DateTime TransDate { get; set; }
    ...
}

所以如果我有6个LineItems,Status = P for all和

TransDate = { 8/1/2011,8/2/2011,8/3/2011,8/5/2011,8/6/2011,8/9/2011 }

分别,我想返回以下列表:

{ (P,8/1/2011-8/3/2011),(P,8/5/2011-8/6/2011),8/9/2011) }

有什么想法吗?我可以手动迭代列表并检查TransDate以查看它是否是顺序的,我只是在寻找更优雅(最好是LINQ)的方式.谢谢!

解决方法

我会使用这样的辅助方法
private static IEnumerable<ICollection<T>> PartitionByPredicate<T>(
    this IEnumerable<T> seq,Func<T,T,bool> split)
{
    var buffer = new List<T>();

    foreach (var x in seq)
    {
        if (buffer.Any() && split(buffer.Last(),x))
        {
            yield return buffer;
            buffer = new List<T>();
        }

        buffer.Add(x);
    }

    if (buffer.Any())
        yield return buffer;
}

然后:

var sorted = LineItems.OrderBy(i => i.TransDate);
var split = sorted.PartitionByPredicate(
    (x,y) => (y.TransDate.Date - x.TransDate.Date).TotalDays > 1)

(编辑:稍微清理一下,我的第一个版本很傻.)

原文链接:https://www.f2er.com/csharp/100223.html

猜你在找的C#相关文章