簡體   English   中英

使用linq group by從具有DateTime屬性的對象列表獲取具有間隔StartDate,EndDate的列表

[英]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)}
        };

您可以將GroupBySelectManyAggregate結合使用:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM