c# – 使用List上的LINQ基于连续日期返回子集列表
发布时间:2020-12-15 07:59:28 所属栏目:百科 来源:网络整理
导读:我有一个场景,我有一个对象列表,在对象中有一个日期时间字段.我试图找出是否有办法使用LINQ按顺序日期时间对列表进行分组,并返回列表的子集,其中顺序日期时间为范围. public virtual IListLineItem LineItems { get; set; }...public class LineItem{ public
我有一个场景,我有一个对象列表,在对象中有一个日期时间字段.我试图找出是否有办法使用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) (编辑:稍微清理一下,我的第一个版本很傻.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |