我有一个场景,我有一个对象列表,在对象中有一个日期时间字段.我试图找出是否有办法使用LINQ按顺序日期时间对列表进行分组,并返回列表的子集,其中顺序日期时间为范围.
public virtual IList<LineItem> LineItems { get; set; }
...
public class LineItem
{
public virtual string Status { get; set; }
public virtual DateTime TransDate { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
所以如果我LineItem和Status = P所有人一起拥有6 秒
TransDate = { 8/1/2011 , 8/2/2011 , 8/3/2011 , 8/5/2011 , 8/6/2011 , 8/9/2011 }
Run Code Online (Sandbox Code Playgroud)
分别,我想返回以下列表:
{ (P, 8/1/2011-8/3/2011) , (P,8/5/2011-8/6/2011) , (P,8/9/2011) }
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?我可以手动迭代列表并检查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;
}
Run Code Online (Sandbox Code Playgroud)
然后:
var sorted = LineItems.OrderBy(i => i.TransDate);
var split = sorted.PartitionByPredicate(
(x, y) => (y.TransDate.Date - x.TransDate.Date).TotalDays > 1)
Run Code Online (Sandbox Code Playgroud)
(编辑:稍微清理一下,我的第一个版本很傻.)