[英]Using linq group by to get from a list of objects with a DateTime property to a list with an interval StartDate, EndDate
我有一个预订实体,按天存储数据,基于此我希望能够创建另一个列表,按间隔存储数据(StartDate,EndDate)如果第一个列表中的日期是连续的,并且分组应该是基于{VenueId,TimePeriodId}对。 任何想法都表示赞赏。
public class BookedRoom
{
public int VenueId { get; set;}
public int TimePeriodId { get; set; }
public DateTime Day { get; set; }
}
public class EventSetup
{
public int VenueId { get; set; }
public int TimePeriodId { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}
List<BookedRoom> bookedRooms = new List<BookedRoom>(){
new BookedRoom { VenueId = 1, TimePeriodId = 1, Day = new DateTime(2013, 9, 1)},
new BookedRoom { VenueId = 1, TimePeriodId = 1, Day = new DateTime(2013, 9, 2)},
new BookedRoom { VenueId = 2, TimePeriodId = 2, Day = new DateTime(2013, 9, 3)},
new BookedRoom { VenueId = 1, TimePeriodId = 1, Day = new DateTime(2013, 9, 4)}
};
// Some Linq to process bookedRooms and obtain a list which I can use to do the following:
List<EventSetup> setups = new List<EventSetup>()
{
new EventSetup{ VenueId =1, TimePeriodId = 1, StartDate=new DateTime(2013, 9, 1), EndDate = new DateTime(2013, 9, 2)},
new EventSetup{ VenueId =2, TimePeriodId = 2, StartDate=new DateTime(2013, 9, 3), EndDate = new DateTime(2013, 9, 3)},
new EventSetup{ VenueId =1, TimePeriodId = 1, StartDate=new DateTime(2013, 9, 4), EndDate = new DateTime(2013, 9, 4)}
};
您可以将GroupBy
与SelectMany
和Aggregate
结合使用:
var setups =
bookedRooms.GroupBy(x => Tuple.Create(x.TimePeriodId, x.VenueId))
.SelectMany(x => x.Aggregate(
new List<EventSetup>(), AccumulateRooms))
.OrderBy(x => x.StartDate)
.ToList();
List<EventSetup> AccumulateRooms(List<EventSetup> existingSetups,
BookedRoom currentRoom)
{
var setup = existingSetups.LastOrDefault();
if(setup == null || setup.EndDate.AddDays(1) != currentRoom.Day.Date)
{
setup = new EventSetup
{
VenueId = currentRoom.VenueId,
TimePeriodId = currentRoom.TimePeriodId,
StartDate = currentRoom.Day.Date,
};
existingSetups.Add(setup);
}
setup.EndDate = currentRoom.Day.Date;
return existingSetups;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.